2012-10-25 17 views
12

Tôi có một lớp học mà phải mất một IRepository trong constructor của nó như thế này ...Làm thế nào để đúng cách giả mạo IQueryable <T> từ Kho lưu trữ bằng cách sử dụng Moq?

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

và có một phương pháp mà trông như thế này ...

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

Các IRepository trông như thế này.

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

Tôi muốn thử nghiệm các phương pháp IsUserActive và chắc chắn rằng nó sẽ trả về false nếu IsActive lĩnh vực của người sử dụng là sai, và ngược lại.

Tôi đang cố gắng sau ...

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

Khi tôi chạy trong NUnit tôi nhận được lỗi "Chuỗi Chưa có yếu tố" trên dòng này

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

đâu tôi đi sai ?

+0

Nevers sử dụng AsQueryable trước, nhờ :) – JoanComasFdz

Trả lời

8

Thay đổi thiết lập mô hình để

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

Một số thông tin bổ sung - Moq không hỗ trợ so sánh các biểu thức. Có một cách để tạo trình phù hợp tùy chỉnh để so sánh 'ToString()' của các biểu thức. Nhưng tôi thực sự không nghĩ nó xứng đáng;) –

Các vấn đề liên quan