4
respostas

Execução do teste no Visual Studio 2019 com .NET 5 não passa no Verify - PERSISTE

Boa tarde. Sei que existem dois fórums anteriores com esse assunto, mas meu caso não solucionou com nenhuma das respostas anteriores. Segue mensagem de erro:

Alura.CoisasAFazer.Testes.CadastraTarefaHandlerExecute.DadoExceptionLancadaLogarMensagemExecao
   Fonte: CadastraTarefaHandlerExecute.cs linha 94
   Duração: 6 ms

  Mensagem: 
System.NotSupportedException : Unsupported expression: log => log.Log(LogLevel.Error, mensagemErro, new[] { (object)It.IsAny<EventId>(), It.IsAny<object>(), excecao, It.IsAny<Func<object, Exception, string>>() })
Extension methods (here: LoggerExtensions.Log) may not be used in setup / verification expressions.

  Rastreamento de Pilha: 
Guard.IsOverridable(MethodInfo method, Expression expression) linha 87
InvocationShape.ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList`1 arguments, Boolean exactGenericTypeArguments, Boolean skipMatcherInitialization, Boolean allowNonOverridable) linha 84
ExpressionExtensions.<Split>g__Split|5_0(Expression e, Expression& r, InvocationShape& p, Boolean assignment, Boolean allowNonOverridableLastProperty) linha 234
ExpressionExtensions.Split(LambdaExpression expression, Boolean allowNonOverridableLastProperty) linha 149
Mock.GetMatchingInvocationCount(Mock mock, LambdaExpression expression, List`1& invocationsToBeMarkedAsVerified) linha 439
Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage) linha 323
Mock`1.Verify(Expression`1 expression, Times times) linha 737
CadastraTarefaHandlerExecute.DadoExceptionLancadaLogarMensagemExecao() linha 127

Meu código:

[Fact]
        public void DadoExceptionLancadaLogarMensagemExecao()
        {
            //arrange
            var mensagemErro = "Houve um erro na inclusão de tarefas";

            var excecao = new Exception(mensagemErro);

            var comando = new CadastraTarefa("Estudar xUnit", new Categoria("Estudo"), new DateTime(2021, 12, 31));

            //Ao invés de usar o bd em memória, eu posso usar o mock
            var mock = new Mock<IRepositorioTarefas>();

            //Simula um repositorio que lança uma excecao no metodo incluirtarefas
            //Aqui faz as configurações como lançamento de exceção
            mock.Setup(obj => obj.IncluirTarefas(It.IsAny<Tarefa[]>()))//It.IsAny == qualquer array de tarefa recebido ele vai lançar exceção
                .Throws(excecao);

            //Instancia do tipo simulado
            var repo = mock.Object; //Dá um objeto pra gente daquilo tipo passado na instancia do mock

            //Usar o mock para passar uma instancia de ILogger
            var mockLogger = new Mock<ILogger<CadastraTarefaHandler>>();
            var log = mockLogger.Object;

            //tratador do comando acima
            var handler = new CadastraTarefaHandler(repo, log);

            //act
            CommandResult resultado = handler.Execute(comando);

            //assert
            //Log error e um metodo de extensao e nao da para fazer verificações ou setups com moq usando metodos de extensao
            //Pra isso vamos ter que usar o metodo mesmo que seria o Log, não o de extensao
            mockLogger.Verify(log => 
            log.Log(
                    LogLevel.Error, //Nível de log (todos os niveis tem metodo que falicitam mas o mock nao aceita) => LogError
                    mensagemErro, //Id do Evento
                    It.IsAny<EventId>(), //Id do Evento
                    It.IsAny<Object>(), //Objeto que será logado, no caso seria a excecao, mas já estou pegando ela em baixo
                    excecao, //exceca que sera logada
                    It.IsAny<Func<object, Exception, string>>()//Funcao Converte objeto e excecao numa string
                ), 
                Times.Once());
        }
4 respostas

O certo seria chamar o Log sem ser o extension, a funcao Log q vc ta chamando no verify é um extension method que recebe 6 parametros. Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

mockLogger.Verify(l =>
                l.Log(
                    LogLevel.Error,
                    It.IsAny<EventId>(),
                    It.IsAny<object>(),
                    exceptionEsperada,
                    It.IsAny<Func<object, Exception, string>>()),
                    Times.Once()
                );

Bom dia. Não entendi o que quis dizer pois fiz exatamente como você colocou ai. Qual seria o certo?

Qual versão do netCore vc esta usando ? Se for 3.1 + provavelmente não irá funcionar conforme demonstrado no curso, vi uma thread no github falando desse problema, vc pode recriar o projeto usando .net 2.2 e deve funcionar conforme demonstrado

Estou usando .NET 5 e quero aprender como fazer nessa versão.