下面是我的测试用例,运行良好。
[TestMethod]
public void GetCompanies_WhenInvokedWithSearchText_ShouldReturnFilteredCompanies()
{
// Arrange
var context = new Mock<IDataContext>(MockBehavior.Strict);
var companies = new List<Company>
{
new Company()
{
Address = "London",
Name = "ABC Inc."
},
new Company()
{
Address = "Newyork",
Name = "Toyota"
},
new Company()
{
Address = "Ealing broadway",
Name = "Amazon"
}
};
context.Setup(s => s.Query<Company>()).Returns(companies.AsQueryable());
var repository = new CompanyRepository(context.Object);
// Act
var expectedCompanies = repository.GetCompanies("ABC");
// Assert
Assert.AreEqual(1, expectedCompanies.Count);
Assert.AreEqual("London", expectedCompanies.ToList()[0].Address);
}
我的存储库代码是这样的:
public ICollection<Company> GetCompanies(string searchText)
{
Guard.ArgumentNotNull(searchText, "searchText");
return _dbContext.Query<Company>().Where(c => c.Name.Contains(searchText) || c.Address.Contains(searchText)).ToList();
}
我只是不明白 Moq 是如何应用实际方法中存在的过滤器(在哪里)的,但我没有在测试中设置?
我的猜测是,当测试执行模拟对象的 Query 方法时,会调用已经应用了过滤器的方法。是否使用反射动态发现 where 子句存在?
只是想清楚地理解它。
最佳答案
没有什么神奇的:)看看这一行
context.Setup(s => s.Query<Company>()).Returns(companies.AsQueryable());
何时方法 Query<Company>()
执行后,返回companies.AsQueryable()
。 Where
是在此基础上执行的,因此 Moq 不会猜测任何内容。
关于asp.net-mvc - 需要帮助了解 Moq 如何解决实际查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969244/