Xunit для возврата нового аргумента

#c# #xunit

#c# #xunit

Вопрос:

Я новичок в Xunit. Я создаю новое исключение в своем коде :

 throw new NotImplementedException("Missing UPC. File is corrupt");
 

в моем тестовом файле я написал:

 [Fact]
public void ParserRow_Throws_Exception_For_Null_UPC()
{
    var record = GetRessoRecord();
    record.UPC = "";

    RevenueReportItem result = Sut.ParseRow(record);

    Assert.Throws<NotImplementedException>(() => Sut.ParseRow(record));
}
 

Сообщение об ошибке в проводнике тестов гласит

Система.Исключение NotImplementedException : отсутствует UPC. Файл поврежден

Как мне добавить возвращенную цитату?

Комментарии:

1. вы вызываете проверенный метод дважды. удалите первый вызов, который находится за пределами assert, так как он вызовет исключение и остановит выполнение теста.

2. спасибо @CeeMcSharpface. жаль, что вы не ответили на это в отдельном ответе, чтобы я мог показать, что это решило проблему!

Ответ №1:

  1. Синхронный вариант Throws<> теперь устарел.
  2. Вы вызываете проверенный метод дважды. Удалите первый вызов, который находится за пределами assert, так как он вызовет исключение и остановит выполнение теста.
  3. Вызов Throws<> возвращает объект исключения, из которого вы можете извлечь и проверить сообщение, например:
 [Fact]
public async Task ParserRow_Throws_Exception_For_Null_UPC() 
{
    var exceptionDetails = await Assert.ThrowsAsync<NotImplementedException>(() => {
        throw new NotImplementedException("foo");
    });

    Assert.Equal("foo", exceptionDetails.Message);
}
 

Комментарии:

1. когда модульный тест выполняется, он попадает в место, где генерируется исключение, и код останавливается. есть какой-нибудь способ обойти это?

2. Я думаю, что в вашем заявлении отсутствует одна важная часть. Throws считается устаревшим для асинхронного кода (Func<Task<T>> ), а не для кода синхронизации!!!

3. пустое решение, новый проект xunit с последней версией .net core и последним пакетом xunit, начиная с неасинхронного факта, утверждает, что compile как и ожидалось, просто только Throws<> не будет компилироваться с информацией о том, что он устарел. это даже ошибка компилятора, а не предупреждение. Я тоже нашел это очень странным, когда понял это во время ответа.

4. @CeeMcSharpface: Я не могу воспроизвести это. См . gist.github.com/jskeet/5bf5776c84ed2becae1c931626871992 , который компилируется без проблем как для xUnit 2.4.1, так и для 2.4.2-pre12.