2013-07-31 54 views
2

以下是我的测试案例,它运行良好。需要帮助以了解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(); 
    } 

我只是不明白这究竟起订量是如何发生的,以应用过滤器(在哪里)这是目前的实际方法,但我并没有设置在测试中?

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

只是想明白它。

回答

2

有没有神奇的:)看看这条线

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

当执行方法Query<Company>(),返回companies.AsQueryable()Where在此执行,所以Moq不会猜测任何东西。

+0

谢谢,我现在明白了......我只嘲笑Query方法,其余部分保持不变。合理。 – SBirthare