Moq:验证重载方法的方法
Moq: Verify method for methods with overloads
我正在实施一项测试,以检查在 service
.
中找到的发送电子邮件的方法
[Fact]
public async Task MailService_SendMailMime_WhenItsOk()
{
//Arrange
var message = new MimeMessage
{
Subject = "My test message",
Body = new TextPart("html")
{
Text = "Test"
}
};
message.From.Add(new MailboxAddress("Collection System", "noreply@myemail.com"));
message.To.Add(new MailboxAddress("User", "to@myemail.com"));
//Act
await _mailService.SendMailMimeAsync(message);
//Assert
_mocker.GetMock<ISmtpClient>().Verify(r => r.SendAsync(message, It.IsAny<MailboxAddress>(), It.IsAny<IEnumerable<MailboxAddress>>(), CancellationToken.None, It.IsAny<ITransferProgress>()), Times.Never);
}
我要测试的方法:
public async Task SendMailMimeAsync(MimeMessage message)
{
try
{
var smtpHost = "mysmpthost.com" ;
using (_smtpClient)
{
await _smtpClient.ConnectAsync(smtpHost, 25, false);
await _smtpClient.SendAsync(message);
}
_logger.LogInformation($"SMTP message sent to {message.To}");
}
catch (Exception ex)
{
_logger.LogInformation($"There was a error while sending a SMTP message to {message.To}");
}
}
有了这个,我尝试使用 Verify()
检查 SendAsync()
方法是否至少被调用了一次。然而,由于他有方法重载,我只是通过指出他从未被调用过(Times.Never
)来测试成功。 _smtpClient
是 MailKit.Net.Smtp
的 class。在此 link 中您可以查看您的方法:http://www.mimekit.net/docs/html/T_MailKit_Net_Smtp_SmtpClient.htm.
由于此方法有多种重载的可能性,我不知道如何最好地测试它。
MailKit 的 IMailTransport
接口为 SendAsync
定义了多个重载:
Task SendAsync(
MimeMessage message,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
Task SendAsync(
MimeMessage message,
MailboxAddress sender,
IEnumerable<MailboxAddress> recipients,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
Task SendAsync(
FormatOptions options,
MimeMessage message,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
Task SendAsync(
FormatOptions options,
MimeMessage message,
MailboxAddress sender,
IEnumerable<MailboxAddress> recipients,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
当您这样调用 SendAsync
时:SendAsync(message)
然后它会将此调用解析为以下重载:
Task SendAsync(
MimeMessage message,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
这意味着以下两个调用是等价的:
SendAsync(message);
SendAsync(message, default, default);
因此,您的 Verify
语句应如下所示:
[Fact]
public async Task MailService_SendMailMime_WhenItsOk()
{
//Arrange
var _smtpClientMock = new Mock<ISmtpClient>();
var _mailService = new MailService(_smtpClientMock.Object);
var message = new MimeMessage
{
Subject = "My test message",
Body = new TextPart("html")
{
Text = "Test"
}
};
//Act
await _mailService.SendMailMimeAsync(message);
//Assert
_smtpClientMock.Verify(client => client.SendAsync(message, default, default), Times.Once);
}
我正在实施一项测试,以检查在 service
.
[Fact]
public async Task MailService_SendMailMime_WhenItsOk()
{
//Arrange
var message = new MimeMessage
{
Subject = "My test message",
Body = new TextPart("html")
{
Text = "Test"
}
};
message.From.Add(new MailboxAddress("Collection System", "noreply@myemail.com"));
message.To.Add(new MailboxAddress("User", "to@myemail.com"));
//Act
await _mailService.SendMailMimeAsync(message);
//Assert
_mocker.GetMock<ISmtpClient>().Verify(r => r.SendAsync(message, It.IsAny<MailboxAddress>(), It.IsAny<IEnumerable<MailboxAddress>>(), CancellationToken.None, It.IsAny<ITransferProgress>()), Times.Never);
}
我要测试的方法:
public async Task SendMailMimeAsync(MimeMessage message)
{
try
{
var smtpHost = "mysmpthost.com" ;
using (_smtpClient)
{
await _smtpClient.ConnectAsync(smtpHost, 25, false);
await _smtpClient.SendAsync(message);
}
_logger.LogInformation($"SMTP message sent to {message.To}");
}
catch (Exception ex)
{
_logger.LogInformation($"There was a error while sending a SMTP message to {message.To}");
}
}
有了这个,我尝试使用 Verify()
检查 SendAsync()
方法是否至少被调用了一次。然而,由于他有方法重载,我只是通过指出他从未被调用过(Times.Never
)来测试成功。 _smtpClient
是 MailKit.Net.Smtp
的 class。在此 link 中您可以查看您的方法:http://www.mimekit.net/docs/html/T_MailKit_Net_Smtp_SmtpClient.htm.
由于此方法有多种重载的可能性,我不知道如何最好地测试它。
MailKit 的 IMailTransport
接口为 SendAsync
定义了多个重载:
Task SendAsync(
MimeMessage message,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
Task SendAsync(
MimeMessage message,
MailboxAddress sender,
IEnumerable<MailboxAddress> recipients,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
Task SendAsync(
FormatOptions options,
MimeMessage message,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
Task SendAsync(
FormatOptions options,
MimeMessage message,
MailboxAddress sender,
IEnumerable<MailboxAddress> recipients,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
当您这样调用 SendAsync
时:SendAsync(message)
然后它会将此调用解析为以下重载:
Task SendAsync(
MimeMessage message,
CancellationToken cancellationToken = default (CancellationToken),
ITransferProgress progress = null);
这意味着以下两个调用是等价的:
SendAsync(message);
SendAsync(message, default, default);
因此,您的 Verify
语句应如下所示:
[Fact]
public async Task MailService_SendMailMime_WhenItsOk()
{
//Arrange
var _smtpClientMock = new Mock<ISmtpClient>();
var _mailService = new MailService(_smtpClientMock.Object);
var message = new MimeMessage
{
Subject = "My test message",
Body = new TextPart("html")
{
Text = "Test"
}
};
//Act
await _mailService.SendMailMimeAsync(message);
//Assert
_smtpClientMock.Verify(client => client.SendAsync(message, default, default), Times.Once);
}