Mockando Contexto em Serviço e Repositório

16/04/2019

4

//Classe
public class Carro{
    public int Codigo {get; set; }
    public string Descricao { get; set; }
}


//Contexto
public class MeuContexto
{
    public virtual DbSet<Carro> Carro { get; set; }
}


//Repositório
public class CarroRepositorio
{
    public CarroRepositorio(MeuContexto contexto) : base (contexto) { }

    public virtual int NovoCodigo()
    {
        return context.Carro.Max(c => c.Codigo) += 1; 
    }
}


//Serviço
public class CarroService
{
    CarroRepositorio repCarro;

    public CarroService(MeuContexto context) : base(context) 
    {
        repCarro = new CarroRepositorio(context)
    }

    public virtual Carro Buscar(int Id)
    {
        return repCarro.Listar().Where(model => model.Codigo == Id).FirstOrDefault();
    }
}


//Testes Com Repositorio que Funciona
[TestMethod]
public void RetornarProximaPlacaComRepositorio()
{
    var _Carros = new List<Carro>{
            new Carro() { Codigo = 1, Descricao = "Gol" },
            new Carro() { Codigo = 2, Descricao = "Uno" }
        }.AsQueryable();

    var DbSet = new Mock<DbSet<Carro>>();
    DbSet.As<IQueryable<Carro>>().Setup(m => m.Provider).Returns(_Carros.Provider);
    DbSet.As<IQueryable<Carro>>().Setup(m => m.Expression).Returns(_Carros.Expression);
    DbSet.As<IQueryable<Carro>>().Setup(m => m.ElementType).Returns(_Carros.ElementType);
    DbSet.As<IQueryable<Carro>>().Setup(m => m.GetEnumerator()).Returns(_Carros.GetEnumerator());

    var Contexto_Mocado = new Mock<MeuContexto>();
    var repositorio = new CarroRepositorio(Contexto_Mocado.Object);

    var ProximoCodigo = repositorio.NovoCodigo();
    var QuantidadeDeCarros = Contexto_Mocado.Object.Carro.ToList();

    Assert.AreEqual(2, QuantidadeDeCarros.Count());
    Assert.AreEqual(3, ProximoCodigo);
}

//Testes Com Serviço que não Funciona
[TestMethod]
public void BuscarCarroComServico()
{
     var Contexto_Mocado = new Mock<GesCooperContext>();
     var repositorio = new Mock<CarroRepositorio>(Contexto_Mocado);
     var servico = new Mock<CarroService>(repositorio.Object.context);

     var Retorno = servico.Object.Buscar(1);

     Assert.AreEqual("Gol", Retorno.FirstOrDefault);
}

Nesse momento queria que o servico ficase com o repositorio mocado que funciona no primeiro teste
e então buscar no mesmo contexto sem precisar setar o Setup para o serviço
[ servico.Setup(s => s.Buscar(1)).Returns(new Carro { Codigo = 1, Descricao = "Gol"}); ]
Alguém sabe se é possível configurar alguma variavel do Mock para este objetivo?
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira