gpt4 book ai didi

c# - 如何使用 Moq stub 接口(interface)方法

转载 作者:行者123 更新时间:2023-11-30 22:08:40 26 4
gpt4 key购买 nike

有没有办法用最小起订量来剔除方法?我看到了很多标题相似的问题,但没有一个能真正回答我的问题。这是给我的一个单元测试示例,我发现使用 Moq 进行测试非常困难。我想做的是对 EmailTask​​s.UserIsValidForNotice() 方法进行单元测试:

public class User
{

public DateTime JoinDate { get; set; }
public bool Active { get; set; }
}

public class EmailTasks
{
IUserRepository repo;
public EmailTasks(IUserRepository repo)
{
this.repo = repo;
}
public IList<User> UserIsValidForNotice(DateTime minDate)
{
return repo.FindAll(u => u.Active && u.JoinDate > minDate);
}
}

public interface IUserRepository
{
IList<User> FindAll(Func<User, bool> q);
}

我可以像下面这样设置一个 stub ,然后轻松地测试查询,但是我无法使用 Moq 来完成它,因为我无法访问 Mocks Return 函数中的方法参数。

public class StubRepo : IUserRepository
{
public IList<User> PersonList { get; set; }

public IList<User> FindAll(Func<User, bool> q)
{
return PersonList.Where(q).ToList();
}
}

我知道这可能不是最好的设计,但我只是想知道是否可以使用 Moq 来完成。

最佳答案

这里的问题是你在测试什么?

IMO,您应该测试的是您是否使用正确的 Func 调用了存储库。您可以按如下方式执行此操作:

[Test]
public void UserIsValidForNotice_has_correct_expression()
{
var repoMock = new Mock<IUserRepository>();

var sut = new EmailTasks(repoMock.Object);
sut.UserIsValidForNotice(DateTime.Now);

repoMock.Verify(r => r.FindAll(It.Is<Func<User, bool>>(func => func(someUser));
}

当您调用 Verify 方法时,您检查是否已调用存储库。此外,您检查它是否已使用 Func<User, bool> 的实例调用(即 It.Is<> 部分。

对于 It.Is<>您可以指定回调将获取传递的参数,并在参数有效时返回 true,否则返回 false。所以在那个回调中你可以执行 Func超过已知用户并检查其评估是否正确。

如果你仍然想把它 stub 并返回一些东西,你可以这样做:

repoMock.Setup(r => r.FindAll(It.IsAny<Func<User, bool>>)
.Returns<Func<User, bool>, IList<User>>(fnc => new List<User>());

如果调用 Returns 的通用重载您最多可以指定 8 个类型参数。第一个将传递给您提供的表达式(来自实际调用),而最后一个确定返回类型。

关于c# - 如何使用 Moq stub 接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22102120/

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