【问题标题】:Mocking parameter test模拟参数测试
【发布时间】:2012-11-11 21:47:55
【问题描述】:

我正在尝试测试传递给接口的参数是否正确:

MailMessage expectedMailMessage = new MailMessage();

var mailerMock = new Mock<IMailSender>();
mailerMock.Setup(m => m.Send(expectedMailMessage)).Verifiable();

Mailer mailer = new Mailer(mailerMock.Object);
mailer.Send(expectedMailMessage);

mailerMock.Verify(m => m.Send(expectedMailMessage), Times.Once());

邮件类:

public class Mailer : IMailer
{
    private readonly IMailSender _mailSender;
    public Mailer(IMailSender mailSender)
    {
        _mailSender = mailSender;
    }

    public void Send(MailMessage mailMessage)
    {
        _mailSender.Send(mailMessage);
    }
}

但这仍然失败,问题是它很难调试。我检查了是否生成了一些随机 Guid 或设置了日期,但我找不到任何东西。

【问题讨论】:

  • 您确定应该将模拟对象传递给 Send() 方法吗?
  • 您需要从邮件中发布代码,因为问题就在那里。
  • 我同意 Ufuk。 Send() 显然将 Mock 对象作为参数,这似乎很奇怪?你确定这是正确的吗?
  • 是的,没错,我更新了我的帖子。

标签: c# unit-testing moq


【解决方案1】:

您将 mailerMock 而不是 expectedMailMessage 传递给您的 Send 方法:

Mailer mailer = new Mailer(mailerMock.Object);
mailer.Send(expectedMailMessage);

【讨论】:

  • 对不起,这是我的错字。
  • @Rogier21 看起来您没有提供实际代码,因为 Moq 默认情况下将通过引用比较实际参数和预期参数。如果你通过了expectedMailMessage,那么测试应该不会失败。
  • 我是这么想的,但是对于这个例子它不起作用,但我不知道为什么不。
  • @Rogier21 我仍然认为您将其他对象传递给Send 方法,而不是在测试开始时创建的对象。
【解决方案2】:

经过一番摆弄,我放弃了,想出了这个:

mailerMock.Verify(m => m.Send(It.Is<MailMessage>(msg => msg.Subject == expectedMailMessage.Subject));
mailerMock.Verify(m => m.Send(It.Is<MailMessage>(msg => msg.Sender == expectedMailMessage.Sender));

也更容易查看失败的属性。

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2015-09-16
    • 2017-03-24
    相关资源
    最近更新 更多