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 ?
Nevers sử dụng AsQueryable trước, nhờ :) – JoanComasFdz