Я пытаюсь написать тест Xunit по этому методу:
public async Task<IEnumerable<T>> RunSQLQueryAsync(string queryString)
{
try
{
//do something
}
catch (DocumentClientException e)
{
throw new InvalidOperationException(e);
}
}
Вот модульный тест:
[Fact]
public async virtual Task Test_Exception()
{
var queryString = "SELECT * FROM c";
var exception = Record.ExceptionAsync(async () => await classname.RunSQLQueryAsync(queryString));
Assert.NotNull(exception);
Assert.IsType<DocumentClientException>(exception);
}
Но метод не удался, и он говорит:
Message: Assert.IsType() Failure Expected: System.DocumentClientException Actual:
System.Threading.Tasks.Task`1[[System.Exception, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxx]]
Когда я отлаживал тест, он не попадает в блок catch. Итак, мой вопрос в том, как сделать так, чтобы модульный тест ожидал, что метод RunSQLQueryAsync
будет иметь DocumentClientException
?
Более подробная информация в (другой поток по SO) [stackoverflow.com/questions/45017295/….
Тест не ожидает Task<Exception>
, возвращенного от Record.ExceptionAsync
, поэтому следующее утверждение фактически выполняется на самом Task
.
Также тестируемый метод потребляет DocumentClientException
и генерирует новое исключение InvalidOperationException
, так что это тип, которого следует ожидать.
[Fact]
public async virtual Task Test_Exception() {
//Arrange
var queryString = "SELECT * FROM c";
//Act
var exception = await Record.ExceptionAsync(() =>
classname.RunSQLQueryAsync(queryString));
//Assert
Assert.NotNull(exception);
Assert.IsType<InvalidOperationException>(exception);
}
Обратите внимание на ожидание перед Record.ExceptionAsync
Предполагается также, что тестируемый класс был настроен с имитацией зависимости, которая вызовет желаемое исключение в части //do something
предоставленного фрагмента.
хм, он все равно не попадает в ловушку. Одна путаница заключается в том, что, допустим, база данных или коллекция в cosmosdb, к которой мы подключаемся, не существует, тогда она перейдет в блок catch. Но модульный тест не собирается подключаться к cosmosdb и обнаруживать, что их не существует ...
@WendyW. Предоставьте более подробную информацию о тестируемом методе. Обратите внимание на мою сноску о том, как создается исключение. Я должен сделать это предположение, потому что в исходном вопросе не было информации о том, как создается исключение.
@WendyW. вы пытаетесь поймать конкретное исключение. Если его не бросить, то его не поймают.
вы не ожидаете выполнения задачи, поэтому утверждение находится в Задаче.
var exception = await Record.ExceptionAsync(async () => await classname.RunSQLQueryAsync(queryString));