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

Dúvida no Moq e Verify

Boa tardeEstou com dúvida nesse teste, pois o NUnit afirma que m => m.atualiza(leilao) nunca foi setado, porém eu fiz o setup do dao e o método é chamado na sua respectiva classe. Alguém pode me ajudar?

    [Test]
        public void DeveEncerrarOsLeiloesESalvarNoDao()
        {
            DateTime data = new DateTime(2012,4,3);

            leilao.naData(data);
            leilao2.naData(data);

            List<Leilao> leiloes = new List<Leilao>();
            leiloes.Add(leilao);
            leiloes.Add(leilao2);

            var dao = new Mock<RepositorioDeLeiloes>();
            dao.Setup(m => m.correntes()).Returns(leiloes);

            EncerradorDeLeilao encerrador = new EncerradorDeLeilao(dao.Object);

            encerrador.encerra();


            dao.Verify(m => m.atualiza(leilao),Times.Once());
            dao.Verify(m => m.atualiza(leilao2),Times.Once());


        }
6 respostas

Olá Fabiana,

ele está dando erro de assert ou soltando alguma exception?

Uma das coisas que pode estar interferindo no seu teste é que o leilao e leilao2 foram criados fora do método de teste. Não sei se os valores originais deles batem com o cenário necessário. Manda o código da classe inteira de teste só para eu dar uma olhada o que está acontecendo com estes leilões.

Beleza Lucas, aqui está a classe:

[TestFixture]
    class EncerradorDeLeilaoTest
    {
        private Leilao leilao;
        private Leilao leilao2;
        private List<Leilao> leiloes;


        [SetUp]
        public void SetUp()
        {

            this.leilao = new Leilao("Nintendo Switch");
            this.leilao2 = new Leilao("Playstation");
            this.leiloes = new List<Leilao>();
            leiloes.Add(leilao);
            leiloes.Add(leilao2);        

        }

        [Test]
        public void DeveEncerrarLeiloesIniciadosHaUmaSemana()
        {
            DateTime data = new DateTime(2018, 4, 30);
            leilao.naData(data);
            leilao2.naData(data);

            //adicionar o mock do DAO para nao precisar acessar o banco de dados
            var carteiro = new Mock<Carteiro>();
            var dao = new Mock<RepositorioDeLeiloes>();
            dao.Setup(m => m.correntes()).Returns(leiloes);

            EncerradorDeLeilao encerrador = new EncerradorDeLeilao(dao.Object);
            encerrador.encerra();

            Assert.AreEqual(2, leiloes.Count);
            Assert.AreEqual(2, encerrador.total);
            Assert.IsTrue(leiloes[0].encerrado);
            Assert.IsTrue(leiloes[1].encerrado);

        }

        [Test]
        public void NaoDeveEncerrarLeiloesIniciadosHoje()
        {
            DateTime data = new DateTime();
            data = DateTime.Today;
            leilao.naData(data);
            leilao2.naData(data);

            var carteiro = new Mock<Carteiro>();
            var dao = new Mock<RepositorioDeLeiloes>();
            dao.Setup(m => m.correntes()).Returns(leiloes);

            EncerradorDeLeilao encerrador = new EncerradorDeLeilao(dao.Object);
            encerrador.encerra();
            Assert.AreEqual(2, leiloes.Count);
            Assert.AreEqual(0, encerrador.total);
            Assert.IsFalse(leiloes[0].encerrado);
            Assert.IsFalse(leiloes[1].encerrado);
        }

        [Test]
        public void NaoFazerNadaQdoNaoTemNenhumLeilao()
        {
            List<Leilao> listaVazia = new List<Leilao>();

            var carteiro = new Mock<Carteiro>();
            var dao = new Mock<RepositorioDeLeiloes>();
            dao.Setup(m => m.correntes()).Returns(listaVazia);

            EncerradorDeLeilao encerrador = new EncerradorDeLeilao(dao.Object);
            encerrador.encerra();
            Assert.AreEqual(0, encerrador.total);

        }

        [Test]
        public void DeveEncerrarOsLeiloesESalvarNoDao()
        {
            DateTime data = new DateTime(2012,4,3);
            leilao.naData(data);
            leilao2.naData(data);

            var dao = new Mock<RepositorioDeLeiloes>();
            dao.Setup(m => m.correntes()).Returns(leiloes);

            var carteiro = new Mock<Carteiro>();

            EncerradorDeLeilao encerrador = new EncerradorDeLeilao(dao.Object);

            encerrador.encerra();

            dao.Verify(m => m.atualiza(leilao),Times.Once());
            dao.Verify(m => m.atualiza(leilao2),Times.Once());
        }
    }

Estranho, parece tudo certo. Me manda a classe EncerradorDeLeilao para eu dar uma olhada também.

Talvez o erro seja aqui mesmo, mas não consigo identificar.

public class EncerradorDeLeilao
    {

        private Carteiro carteiro;
        private RepositorioDeLeiloes dao;

        public EncerradorDeLeilao(RepositorioDeLeiloes dao2, Carteiro carteiro)
        {
            this.dao = dao2;
            this.carteiro = carteiro;
            total = 0;
        }


        private object @object;

        public int total { get; private set; }


        public EncerradorDeLeilao()
        {
            total = 0;
        }

        public EncerradorDeLeilao(object @object)
        {
            this.@object = @object;
        }

        public virtual void encerra()
        {

            LeilaoDaoFalso dao = new LeilaoDaoFalso();
            List<Leilao> todosLeiloesCorrentes = dao.correntes();

            foreach (var l in todosLeiloesCorrentes)
            {

                if (comecouSemanaPassada(l))
                {

                    l.encerra();
                    total++;
                    dao.atualiza(l);

                }
            }
        }


        private bool comecouSemanaPassada(Leilao leilao)
        {

            return diasEntre(leilao.data, DateTime.Now) >= 7;

        }

        private int diasEntre(DateTime inicio, DateTime fim)
        {
            int dias = (int)(fim - inicio).TotalDays;

            return dias;
        }

    }
solução!

O problema está no método encerra, pois ele não está usando o dao que foi injetado no construtor do EncerradorDeLeilao. Ele por enquanto está usando o dao que é instanciado dentro do método, por isso que ele não aplica as regras mockadas no teste.

Então é só tirar a instância local do dao apagando isso aqui

LeilaoDaoFalso dao = new LeilaoDaoFalso();

que os testes agora devem funcionar.

Funcionou! Muito 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