gpt4 book ai didi

c# - 如何使用 Moq 验证多个方法调用

转载 作者:IT王子 更新时间:2023-10-29 04:38:56 26 4
gpt4 key购买 nike

所以场景是这样的:用户执行某些操作(例如获得徽章或解锁某些东西)并发送电子邮件通知。一个给用户(带有一条消息,例如“您已经解锁了 XYZ...”),然后向他们的每个 friend 发送一条不同的消息,例如(“您的 friend 已经解锁了 XYZ...”)。

public interface INotify
{
void Notify(User user, User friend);
}

public class NotificationService
{
private IEnumerable<INotify> _notifiers;

public NotificationService(IEnumerable<INotify> notifiers)
{
_notifiers = notifiers;
}

public SendNotifications()
{
User user = GetUser();
IEnumerable<User> friends = GetFriends();

foreach(var notifier in _notifiers)
{
//Send notification to user
notifier.Notify(user, null);

//send notification to users friends
foreach(var friend in friends)
notifier.Notify(user, friend);
}
}
}

我正在尝试使用最小起订量来测试每个通知程序是否被调用 2x。一次将 null 作为第二个参数传递,第二次将值传递给两个参数。

[Test]
public void MakeSureEveryoneIsNotified()
{
var notifierMock = new Mock<INotifier>();

var svc = new NotificationService(new List<INotifier>{ notifierMock.Object });
svc.SendNotifications();

notifierMock.Verify(x => x.Notify(It.Is<User>(user => user.UserId == 1), null), Times.Once());
notifierMock.Verify(x => x.Notify(It.Is<User>(user => user.UserId == 1), It.Is<User>(user => user.UserId == 2)), Times.Once());
}

问题是第二个验证调用为第二个参数抛出 ArgumentNullException。有没有说“检查第一个调用有这些参数,然后第二个调用有其他参数”。我知道我可以通过调用来绕过它:

notifierMock.Verify(x => x.Notify(It.IsAny<User>(), It.IsAny<User>()), Times.Exactly(2));

但我想更具体一点。无论如何要这样做?

最佳答案

您可以通过记录每次调用 Notify 时发生的情况来实现这一点。然后您可以将录音与预期的进行比较:

[TestMethod]
public void TestMoqInvocations()
{
var notifierMock = new Mock<INotifier>();

var svc = new NotificationService(new List<INotifier>{ notifierMock.Object });
svc.SendNotifications();

var invocations = new List<NotifyParams>();

notifierMock
.Setup(f => f.Notify(It.IsAny<User>(), It.IsAny<User>()))
.Callback<string, string>((user, friend) => invocations.Add(new NotifyParams{user = user, friend = friend}));

Assert.AreEqual(1, invocations[0].user.UserId);
Assert.IsNull(invocations[0].friend);
Assert.AreEqual(1, invocations[1].user.UserId);
Assert.AreEqual(2, invocations[1].user.UserId);
}

public struct NotifyParams {
public User user {get;set;}
public User friend { get; set; }
}

关于c# - 如何使用 Moq 验证多个方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6273551/

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