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());
}