Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro em Teste: System.NullReference.Exception

Bom dia,Estou com dúvida em um teste que está dando um erro de referência nula, e não está sendo possível determinar se ele falha ou passa.Aqui está a classe que ele testa:

public class GeradorDePagamento
    {
        private LeilaoDaoFalso leilaoDao;
        private PagamentoDao pagamentoDao;
        private Avaliador avaliador;

        public GeradorDePagamento(LeilaoDaoFalso leilaoDao,PagamentoDao pagamentoDao,Avaliador avaliador)
        {
            this.leilaoDao = leilaoDao;
            this.pagamentoDao = pagamentoDao;
            this.avaliador = avaliador;
        }

        public virtual void Gera()
        {
            List<Leilao> encerrados = leilaoDao.encerrados();
            foreach(var l in encerrados)
            {
                this.avaliador.avalia(l);

                Pagamento pagamento = new Pagamento(this.avaliador.maiorValor, this.ProximoDiaUtil());

                this.pagamentoDao.salva(pagamento);

            }
        }

        private DateTime ProximoDiaUtil()
        {
            DateTime data = DateTime.Today;
            DayOfWeek diaDaSemana = data.DayOfWeek;

            if (diaDaSemana == DayOfWeek.Saturday)
            {
                data.AddDays(2);
            }
            else if (diaDaSemana == DayOfWeek.Sunday)
            {
                data.AddDays(1);
            }

            return data;
        }
    }

E esse é o teste:

[TestFixture]
    class GeradorDePagamentoTest
    {
        private Leilao leilao;
        private Usuario jorge;
        private Usuario maria;
        private List<Leilao> leiloes;
        private Avaliador avaliador;
        private Pagamento pagamentoCapturado;

        [SetUp]
        public void SetUp()
        {
            leilao = new Leilao("Playstation");
            jorge = new Usuario("Jorge");
            maria = new Usuario("Maria");
            avaliador = new Avaliador();
            leilao.propoe(new Lance(jorge, 2000));
            leilao.propoe(new Lance(maria, 2500));
            leiloes = new List<Leilao>();
            leiloes.Add(leilao);
            leilao.naData(new DateTime(1999, 5, 1));
            pagamentoCapturado = null;
        }
[Test]
        public void DevePassarParaOProximoDiaUtil()
        {
            var leilaoDao = new Mock<LeilaoDaoFalso>();
            var pagamentoDao = new Mock<PagamentoDao>();

            GeradorDePagamento gerador = new GeradorDePagamento(leilaoDao.Object, pagamentoDao.Object, avaliador);

            //ensinando o mock a retornar a lista de leiloes quando sao chamados os leiloes encerrados
            leilaoDao.Setup(m => m.encerrados()).Returns(leiloes);
            //quando eh chamado p.salva passando QUALQUER pagamento, executa um callback que salva o valor na variavel pagamentoCapturado
            pagamentoDao.Setup(p => p.salva(It.IsAny<Pagamento>())).Callback<Pagamento>(p => pagamentoCapturado = p);

            Assert.AreEqual(DayOfWeek.Monday, pagamentoCapturado.data.DayOfWeek);

        }

O erro aponta para esta linha:

Assert.AreEqual(DayOfWeek.Monday, pagamentoCapturado.data.DayOfWeek);
2 respostas
solução!

Olá Fabiana,

um teste sempre é composto por 3 momentos: cenário, ação e a validação. No seu caso você descreveu todo o cenário que seria criar os leiloes, instanciar os mocks e fazer o setup de todo mundo. Também tem a validação que é o assert.

No caso o que ficou faltando é justamente a ação que queremos testar, que é chamar o método Gera do GeradorDePagamento antes de fazer os asserts.

Obrigada, Lucas!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software