Sou novo no NUnit (3.4+) e de alguma forma não consigo resolver o problema simples abaixo :)
Quero ter certeza de que os blocos catch estão cobertos na cobertura do Sonar e, para isso, quero escrever um caso de teste Nunit. Tentei algumas coisas, mas nada funcionou para mim e continuei recebendo erro/falha de teste. Este é meu método testável. (Observe que, por algum motivo, não posso alterar os métodos apenas para o caso de teste Nunit.)
public async Task<List<ReturnObjects>> GetData(int Id)
{
try
{
}
catch(Exception)
{
}
Meu caso de teste:
[Test]
public async Task CanCallGetData_Test_ThrowsException()
{
// Arrange</p>
var Id = 927810493;</p>
List<ReturnObjects> objs = null; //I tried making it null, so null reference
//exception will throw.
//Some repo class with mock data</p>
_queryHelperDataMart.Setup(mock => mock.WrapQueryAsync<ReturnObjects>
(It.IsAny<string>(), It.IsAny<IConfiguration>(), It.IsAny<Dictionary<string,
object>>(),
It.IsAny<string>())).ReturnsAsync(objs);
// Act
var result = Assert.ThrowsAsync<Exception>(() => _testClass.GetData(Id));
// Assert
Assert.That(result, ..check exception etc);
}
Continuo recebendo Expected: <System.Exception> But was: null O que estou esquecendo aqui? Além disso, por favor, me diga como escrever um código testável para blocos catch quando não for possível gerar uma exceção real do método de teste?
Como já mencionado, se você capturar uma exceção,
Assert.ThrowsAsync
isso não funcionará, pois ele verifica se a exceção foi gerada pelo método que você invocou (portanto, não foi capturada).Mas é uma boa abordagem cobrir
catch
bloco. No entanto, você deve validar que o código dentrocatch
foi executado.E para lançar exceção em teste unitário, é melhor configurar seu mock para fazer isso. Algo como abaixo:
Às vezes me encontro em situações em que não há muito o que afirmar no bloco catch, então costumo escrever esses testes de unidade para garantir que, em caso de exceção, o código em teste irá lidar com isso: