none
Fake DbContext Entity Framework RRS feed

  • Pergunta

  • Boa tarde pessoal.

    Estava procurando algum modelo de uso de Entity Framework Code First com Unit Test, e cheguei ao seguinte modelo para criar um Fake DbContext.

    Primeiro troca-se as propriedades de DbSet<T> para IDbSet<T> e então criamos um Fake DbSet

    public class FakeDbSet<T> : IDbSet<T> where T : class

    Assim sobrescrevemos os métodos usado pelo EF (Add, Remove, Attach, Etc) 

    Ficando a classe FakeContext da seguinte forma.

    public class FakeContext: ISiteDbContext
    {
    	public IDbSet<Estado> Estados { get; set; }
    	public IDbSet<Cidade> Cidades { get; set; }
    	public IDbSet<Bairro> Bairros { get; set; }
    
    	public FakeContext()
    	{
    		this.Estados = new FakeDbSetEstados();
    		this.Cidades = new FakeDbSetCidades();
    		this.Bairros = new FakeDbSetBairros();
    	}
    }

    Até aqui tudo perfeito.

    Uma coisa que não me agradou é que o método Find precisa ser sobrescrito em todas as entidades, pois preciso saber qual propriedade é a chave da entidade para fazer a busca.

    conforme abaixo.

    public class FakeDbSetBairros : FakeDbSet<Bairro>
    {
    	public override Bairro Find(params object[] keyValues)
    	{
    		return this.SingleOrDefault(p => p.IdBairro == (int)keyValues.Single());
    	}
    }
    	
    public class FakeDbSetCidades : FakeDbSet<Cidade>
    {
    	public override Cidade Find(params object[] keyValues)
    	{
    		return this.SingleOrDefault(p => p.IdCidade == (int)keyValues.Single());
    	}
    }
    
    public class FakeDbSetEstados : FakeDbSet<Estado>
    {
    	public override Estado Find(params object[] keyValues)
    	{
    		return this.SingleOrDefault(p => p.IdEstado == (int)keyValues.Single());
    	}
    }

    Agora vem a minha duvida.

    Seria possível eu criar um construtor na classe FakeDbSet da seguinte forma

    public FakeDbSet(Expression<Func<T, object>> expression)

    e usar na classe FakeContext passando no construtor qual é a chave para o método find? Conforme abaixo.

    public FakeContext()
    {
    	this.Estados = new FakeDbSetEstados(p => p.IdEstado);
    	this.Cidades = new FakeDbSetCidades(p => p.IdCidade);
    	this.Bairros = new FakeDbSetBairros(p => p.IdBairro);
    }
    Assim eu poderia informar qual é a chave que vai ser usada no find...

    Como posso usar uma Expression/Func no SingleOrDefault?

    Obrigado
    terça-feira, 11 de junho de 2013 17:49