Тест проходит при возникновении исключения

#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>());
}