gpt4 book ai didi

c# - 如何使用 Moq 从 Repository 中正确伪造 IQueryable

转载 作者:可可西里 更新时间:2023-11-01 08:10:39 25 4
gpt4 key购买 nike

我有一个类在其构造函数中采用 IRepository,如下所示......

    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 时返回 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 中运行时,我在这一行收到错误“Sequence Contains No Elements”

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

我哪里错了?

最佳答案

将模拟设置更改为

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

关于c# - 如何使用 Moq 从 Repository 中正确伪造 IQueryable<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13072725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com