Почему я не могу обнаружить это исключение в своих тестах - PullRequest
0 голосов
/ 05 февраля 2020

Я пишу тест Intigration с использованием nUnit в C#.

Мой код:

public async Task<bool> WriteData(Document data, string tableName)
{
   try
   {
      var table = Table.LoadTable(_dynamoDbClient, tableName);
      table.PutItem(data);
      return true;
   }
   catch (Exception e)
   {
     _logger.Info("Failed Writing Record");
     _logger.Info("Error: " + e.Message);
     return false;
   }
}

Мой тест:

public void TestToSeeIfWeGetAnExceptionWhenProvidingBadDataToTheDatabase()
{
   // arrange
   var item = new Document
   {
      ["Id"] = "1001",
      ["TransactionID"] = 111111,
      ["StatementType"] = "TestBank"
   };

   _bankStatementTable = "does-not-exist";

   // act / assert

   Assert.Catch<System.Exception>(() => _awsDynamoDbManager.WriteData(item, _bankStatementTable));
}

Потому что я Я передаю неверные данные в базу данных. Ожидается исключение, и я его получаю.
Однако тест не пройден. Я получаю это сообщение от организатора теста:

Ожидается: экземпляр

Но было: null

Если я запускаю тест в Debug, я вижу удар Catch. Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Вы должны немного обновить свой код. Снова введите Exception in catch block и используйте ThrowsAsync

catch (Exception e)
{
     _logger.Info("Failed Writing Record");
     _logger.Info("Error: " + e.Message);
     throw;
}
...
Assert.ThrowsAsync<System.Exception>(async () => await _awsDynamoDbManager.WriteData(item, _bankStatementTable));

Или убедитесь, что WriteData возвращает false, выполнив тест как async и вызов Assert.IsFalse

public async Task TestToSeeIfWeGetAnExceptionWhenProvidingBadDataToTheDatabase()
{
   // arrange
   ...
   // act / assert

   var result = await _awsDynamoDbManager.WriteData(item, _bankStatementTable);
   Assert.IsFalse(result);
}

Поскольку внутри метода WriteData нет ожидаемого кода, вы можете сделать его синхронным и использовать Task.FromResult в качестве возвращаемого результата или сделать его еще проще и удалить с помощью Task<bool>

public bool WriteData(Document data, string tableName)
{
   try
   {
      var table = Table.LoadTable(_dynamoDbClient, tableName);
      table.PutItem(data);
      return true;
   }
   catch (Exception e)
   {
     _logger.Info("Failed Writing Record");
     _logger.Info("Error: " + e.Message);
     return false; //or throw;
   }
}

И синхронный тестовый код

Assert.Throws<System.Exception>(() => _awsDynamoDbManager.WriteData(item, _bankStatementTable));

или

public void TestToSeeIfWeGetAnExceptionWhenProvidingBadDataToTheDatabase()
{
   // arrange
   ...
   // act / assert

   var result = _awsDynamoDbManager.WriteData(item, _bankStatementTable);
   Assert.IsFalse(result);
}
0 голосов
/ 05 февраля 2020

Поскольку вы возвращаете false в случае исключения:

catch (Exception e)
{
    _logger.Info("Failed Writing Record");
    _logger.Info("Error: " + e.Message);
    return false;
}

Используйте предложение throw.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...