#c# #unit-testing #nunit #moq
#c# #модульное тестирование #nunit #moq
Вопрос:
У меня есть следующий тест в Nunit с Moq:
[TestFixture]
public class MessageServiceTests
{
private Mock<IFtpClient> _ftpService;
private IMessageService _messageService;
[SetUp]
public void Setup()
{
_ftpService = new Mock<IFtpClient>();
_messageService = new MessageService(_ftpService.Object);
}
[Test]
public void SendAsync_WithSettings_ConnectsWithCredentials()
{
//act
_messageService.SendAsync(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<Settings>());
}
}
и следующий метод, который тестируется:
public async Task SendAsync(Stream stream, string fileName, Settings settings)
{
throw new NotImplementedException();
}
Ожидается, что тест завершится неудачей, но когда я запускаю его в Visual Studio, он проходит. Я не могу разобраться в этом, тесты должны завершаться неудачей при возникновении неожиданного исключения, верно? Так почему же он проходит?
Ответ №1:
SendAsync
успешно запущен и вернул a Task
, который содержал исключение (его IsFaulted
свойство возвращает true
, а его Exception
свойство содержит NotImplementedException
).
Однако вы не проверяете Task
, который возвращается из SendAsync
, поэтому вы никогда не понимаете, что он содержит исключение.
Самый простой способ проверить Task
наличие исключений — использовать await
и создать свой метод тестирования async Task
. Это также обрабатывает случай, когда Task
не завершается сразу.
[Test]
public async Task SendAsync_WithSettings_ConnectsWithCredentials()
{
//act
await _messageService.SendAsync(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<Settings>());
}