Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro ao avaliar expression no Mock

Olá, após completar o curso de web api, resolvi desenvolver um projeto próprio. Estou com problemas na implementação do teste unitário.

No meu (Expression<Func<Pessoa, bool>> predicate) => MockPessoaRepository.Filter(predicate) o predicate não retorna a minha expressão, eu já revisei tudo, mas mesmo assim ele não retorna nada.

Como poderia fazer no meu Mock retornasse um filtro de pessoas?

Este é o código do meu teste unitário.

public class IncluirPessoaTest
    {
        public readonly Mock<IPessoaRepository> _pessoaRepository;
        public readonly Mock<NotificationContext> _notificationContext;
        public readonly PessoaService _pessoaService;
        public IncluirPessoaTest()
        {
            _pessoaRepository = new Mock<IPessoaRepository>();
            _notificationContext = new Mock<NotificationContext>();
            _pessoaService = new PessoaService(_pessoaRepository.Object, _notificationContext.Object);
        }

        private void SetupTest()
        {
            _pessoaRepository.Setup(s => s.Filter(It.IsAny<Expression<Func<Pessoa, bool>>>()))
                             .Returns((Expression<Func<Pessoa, bool>> predicate) => MockPessoaRepository.Filter(predicate));

            _pessoaRepository.Setup(s => s.ById(It.IsAny<int>()))
                             .Returns((int id) => MockPessoaRepository.ById(id));
        }

        [Theory]
        [MemberData(nameof(ParametrosEsperados))]
        public void AoIncluirUmaPessoaDeveValidarERetornarMensagemValidacaoCasoHouver(Pessoa pessoaInclusao, bool ehValido, Notification notifications)
        {
            SetupTest();

            _pessoaService.InserirPessoa(pessoaInclusao);

            _notificationContext.Object.Valid.Should().Be(ehValido);
            _notificationContext.Object.Notifications.Should().ContainEquivalentOf(notifications);

        }


        public static IEnumerable<object[]> ParametrosEsperados()
        {
            yield return new object[]
            {
                new Pessoa(id:0,
                          nome:"Henrique R. Firmino",
                          cpf:"055.820.631-05",
                          dataNascimento: new DateTime(year: 1995, month: 12, day:8),
                          email:"henrique_rfirmino@hotmail.com",
                          telefone: "(65) 99661-8430",
                          usuario: "henrique",
                          senha: "112345"),
                false,
                new Notification("CPF", "O CPF 055.820.631-05 já está cadastrado a uma pessoa.")
            };
        }
    }
public class MockPessoaRepository
    {
        private static IQueryable<Pessoa> _massaDeDados = new List<Pessoa>()
        {
            new Pessoa(id: 1,
                         nome: "Henrique R. Firmino",
                         cpf: "055.820.631-05",
                         dataNascimento: new DateTime(year: 1995, month: 12, day: 8),
                         email: "henrique_rfirmino@hotmail.com",
                         telefone: "(65) 99661-8430",
                         usuario: "henrique3",
                         senha: "112353"),
                new Pessoa(id: 2,
                         nome: "Giulia Bueno",
                         cpf: "055.820.633-05",
                         dataNascimento: new DateTime(year: 1997, month: 7, day: 4),
                         email: "giuliabueno52@gmail.com",
                         telefone: "(65) 99661-8432",
                         usuario: "giulia",
                         senha: "435432")
        }.AsQueryable();

        public static IQueryable<Pessoa> MassaDeDados { get { return _massaDeDados; } }

        public static IQueryable<Pessoa> Filter(Expression<Func<Pessoa, bool>> predicate)
        {
            return _massaDeDados.Where(predicate);
        }

        public static Pessoa ById(int id) => _massaDeDados.SingleOrDefault(p => p.Id.Equals(id));
    }
1 resposta
solução!

Resolvi o problema! Depois de alguns dias quebrando a cabeça. hehehe

No meu Validator, utiliza o tipo Pessoa, a propriedade de CPF é um struct valueType, apesar de ter um convesor implicito para string, aparentemente a expression do moq não funciona legal, a correção foi adicionar ToString().

public Notification Validar()
        {
            if ((_pessoaRepository.Filter(p => (p.Cpf.ToString().Equals(_pessoa.Cpf.ToString()) && p.Id != _pessoa.Id))).Any())
                return new Notification("CPF", $"O CPF {_pessoa.Cpf} já está cadastrado a uma pessoa.");

            return null;
        }