Mocking or faking DbEntityEntry or creating a new DbEntityEntry

ef-code-first, entity-framework

Solution

Just like the other case, what you need is to add an additional level of indirection:

interface ISalesContext
{
    IDbSet<T> GetIDbSet<T>();
    void SetModified(object entity)
}

class SalesContext : DbContext, ISalesContext
{
    public IDbSet<T> GetIDbSet<T>()
    {
        return Set<T>();
    }

    public void SetModified(object entity)
    {
        Entry(entity).State = EntityState.Modified;
    }
}

So, instead of calling the implementation, you just call `SetModified`.

Problem

Following on the heels of my other question about mocking DbContext.Set I've got another question about mocking EF Code First. I now have a method for my update that looks like: ``` if (entity == null) throw new ArgumentNullException("entity"); Context.GetIDbSet<T>().Attach(entity); Context.Entry(entity).State = EntityState.Modified; Context.CommitChanges(); return entity; ``` Context is an interface of my own DbContext. The problem I'm running in to is, how do I handle the `Context.Entry(entity).State`. I've stepped through this code and it works when I have a real live DbContext as the implementation of my Context interface. But when I put my fake context there, I don't know how to handle it. There is no constructor for a DbEntityEntry class, so I can't just create a new one in my fake context. Has anyone had any success with either mocking or faking DbEntityEntry in your CodeFirst solutions? Or is there a better way to handle the state changes?

Original source

Related problems