Pergunta

Estamos usando o Nunit & VisualStudio para escrever o código C# .NET há algum tempo. Exceções de teste foram feitas no estilo de

Sintaxe velha:

[Test]
[ExpectException(typeof(ExceptionType))] 
public void TestExceptionType()
{

}

Agora a NuNit lançou a versão 2.5.2 que introduziu Assert.Throws( Type expectedExceptionType, TestDelegate code ); Isso torna o teste de exceção muito mais flexível. Nossos testes de exceção agora são assim:

Nova sintaxe:

[Test]
public void TestWithNullBufferArgument()
{
   ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null));

   // now you can examine the exception and it's properties
   Assert.AreEqual(ex.Message, "Argument was null");
}

Nosso problema é que, se o Assert.

Para esclarecer isso: Definimos o projeto VS contendo os testes de unidade para executar o NUNIT-X86.EXE ao depurar. (Consulte Propriedades do projeto, guia de depuração, a ação inicial está definida para executar o NUNIT-X86.EXE)

Isso impede que Nunit continue os testes. É possível continuar a depuração/teste de unidade pressionando F5, mas essa não é uma solução viável.

Existe alguma maneira de evitar isso? Colocar ... Catch Block em torno do assert.THOWS Não faz nada, já que a exceção acontece no código delegado.

Espero que alguém possa esclarecer isso.

Foi útil?

Solução

O problema em si aparece, porque provavelmente você tem a opção Ativar apenas meu código ativado (Ferramentas-> Opções-> Debugging-> General-> Ativar apenas meu código).

"Quando esse recurso está ativado, o depurador é exibido e entra no código do usuário (" meu código ") apenas, ignorando o código do sistema e outro código que é otimizado ou não possui símbolos de depuração" (ver "Caixa de diálogo Geral, Depuração, Opções")

Normalmente, você tem uma versão de lançamento do NUNIT.Framework.dll, que não possui um arquivo NUNIT.FRAMEWORK.PDB correspondente.

Portanto, existem 2 opções:

  1. Desative o recurso "Just My Code"

  2. Baixar fontes de Nunit (de http://www.nunit.org/index.php?p=download), construa -os no modo de depuração, coloque todo o NUNIT.Framework.

Espero que isto ajude.

Outras dicas

O mesmo problema também me incomodou por algum tempo, fiz alguns testes e encontrei o seguinte:

Se uma biblioteca (Nunit neste caso) for compilada com informações de depuração definida como 'Nenhum', se a construção semelhante a uma abaixo será executada com a biblioteca e o código do Delegate lançar uma exceção, então VS para reclamar da exceção não tratada pelo usuário código.

Código da biblioteca:

public static Exception Throws(TestDelegate code, string message)
{
    Exception caughtException = null;

    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }        

    return caughtException;
}

Código do cliente:

private void btnTest_Click(object sender, EventArgs e)
{
  var ex = MyAssert.Throws(() => { throw new Exception(); }, "");    
}

Definir informações de depuração de um projeto de biblioteca para qualquer outra opção que não seja 'nenhuma' resolve o problema, ou seja, o Depurger não para mais nessas exceções "não atendidas". Eu o testei com o Nunit e minha própria biblioteca enrolada à mão com o código acima (peguei um trecho do método de arremesso de Nunit). Suponho que seja um recurso ou um "recurso" do vs.

Isso nos deixa com tantas opções:

  1. Exceção de filtro, conforme sugerido anteriormente

  2. Recompile nunit.framework.dll para uso local, para evitar essas paradas irritantes

Outras opções podem ser entrar em contato com as equipes de MS ou Nunit ou ambas e pedir que investigem/esclareçam o problema e compilem o Nunit com o nível mínimo de informações de depuração respeitando.

Editar:

Encontrou mais uma opção.

  1. No meu caso, desmarcar 'suprimir a otimização do JIT na carga do módulo' também faz o truque, mesmo que as bibliotecas compiladas sem informações de depuração. No entanto, ele só funciona quando o projeto é executado na configuração de liberação.

Eu acho que você está sendo cego pela afirmação da curta duração. Você pode alcançar a mesma coisa com uma simples tentativa/captura.

try
{
  _testInstance.TestFunction(null);
  Assert.Fail("The method should have thrown...");
}catch{}

Agora, você tem tudo o que precisa. Você falha se a exceção não for lançada e seu código regular pode lidar com exceções conforme o esperado.

Poderia ser alcançável desativando a exceção. Abra o menu Debug/Exceptions e pesquise sua exceção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top