2012-10-25 23 views
12

我有一個類,帶有一個IRepository在其構造是這樣的...如何使用Moq從Repository中正確地僞造IQueryable <T>?

public class UserService 
    { 
     public IRepository<User> _repo { get; set; } 
     public UserService(IRepository<User> repo = null) 
     { 
     _repo = repo ?? new UserRepository(); 
     } 

,並具有類似如下的方法...

public bool IsUserActive(email string) 
{ 
    //The method actually does more but to keep it simple lets imagine 
    // it does this 
    User user = _repo.Find(u => u.Email == email).First(); 
    return user.IsActive; 
} 

的IRepository看起來是這樣的。

public interface IRepository<T> : IDisposable where T : IEntity 
{ 
    void InsertOrUpdate(T entity); 
    void Delete(T entity); 
    IQueryable<T> Find(Func<T, bool> query); 
    T Find(int id); 
    void Save(); 
} 

我想測試IsUserActive方法,並確保如果用戶的IsActive領域是假返回false,反之亦然。

我想下面...

[Test] 
    public void IsUserActive_EmailThatWillReturnInactiveUser_ReturnsFalse() 
    { 
     //Arrange 
     var fakeUserRepo = new Mock<IRepository<User>>(); 
     var query = new Func<User, bool>(u => u.Email == "AnyString"); 
     var listOfMatchingUsers = new List<User>() 
     { 
        new User 
        { 
         Email = "AnyString", 
         IsActive = False 
        } 
     }; 
     IQueryable<User> queryableUsers = listOfMatchingUsers.AsQueryable(); 
     fakeUserRepo.Setup(r => r.Find(query)).Returns(queryableUsers); 
     var userService = new UserService(fakeUserRepo.Object); 

     //Act 
     var result = userService.IsUserActive("AnyString"); 

     //Assert 
     Assert.IsFalse(result); 
    } 

當我在NUnit的運行,我得到「序列不包含任何元素」在這條線上

var result = userService.IsUserActive("AnyString"); 

我要去哪裏錯了錯誤?

+0

訥韋爾之前使用AsQueryable已,謝謝:) – JoanComasFdz

回答

8

更改模擬設置,以

fakeUserRepo.Setup(r => r.Find(It.IsAny<Func<User, bool>>())) 
      .Returns(queryableUsers); 
+0

一些額外的信息 - 起訂量不支持表達式的比較。有一種方法可以創建用於比較表達式的'ToString()'的自定義匹配器。但我真的不認爲這是值得的;) –