需要帮助来了解Moq如何解决实际查询

时间:2013-07-31 11:35:38

标签: asp.net-mvc asp.net-mvc-4 moq

以下是我的测试用例运行良好。

    [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是如何应用实际方法中存在的过滤器(where)但我没有在测试中设置的?

我的猜测是,当测试执行模拟对象时,调用Query方法并且已经应用​​了过滤器。是否使用反射动态地发现了where子句?

只是想清楚地理解它。

1 个答案:

答案 0 :(得分:2)

没有魔法:)看看这一行

context.Setup(s => s.Query<Company>()).Returns(companies.AsQueryable());

执行方法Query<Company>()时,返回companies.AsQueryable()Where被执行了,因此Moq没有猜测任何事情。