2012-10-25 6 views
12

Ho una classe che prende un IRepository nel suo costruttore come questo ...Come falsificare correttamente IQueryable <T> dal repository utilizzando Moq?

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

e ha un metodo che assomiglia a questo ...

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; 
} 

L'IRepository assomiglia a questo.

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(); 
} 

desidero testare il metodo IsUserActive e assicurarsi che restituisce falso se il campo dell'utente IsActive è falsa, e viceversa.

sto cercando il seguente ...

[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); 
    } 

Quando eseguo in NUnit ottengo l'errore "sequenza non contiene elementi" su questa linea

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

Dove sto andando male ?

+0

Nevers utilizzato AsQueryable prima, grazie :) – JoanComasFdz

risposta

8

Modifica impostazione finta di

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

Alcune informazioni aggiuntive - Moq non supporta il confronto di espressioni. C'è un modo per creare un matcher personalizzato per confrontare 'ToString()' di espressioni. Ma davvero non penso che ne valga la pena;) –