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