2011-02-17 3 views
55

내 기타 question about mocking DbContext.Set의 발 뒤꿈치를 따라 가면서 EF Code First를 조롱하는 것에 대한 또 다른 질문이 있습니다.DbEntityEntry를 조롱하거나 가짜로 새 DbEntityEntry를 만들 때

if (entity == null) 
    throw new ArgumentNullException("entity"); 

Context.GetIDbSet<T>().Attach(entity); 
Context.Entry(entity).State = EntityState.Modified; 
Context.CommitChanges(); 

return entity; 

컨텍스트 내 자신의 DbContext의 인터페이스입니다 :

는 지금과 같은 내 업데이트하는 방법이있다.

내가하는 것입니다 실행하고있어 문제는 내가 어떻게

Context.Entry(entity).State을 처리 않습니다.

나는이 코드를 밟았으며, 실제 라이브 DbContext를 컨텍스트 인터페이스 구현으로 사용할 때 작동합니다. 그러나 가짜 컨텍스트를 거기에 넣을 때 어떻게 처리해야할지 모르겠다.

DbEntityEntry 클래스에 대한 생성자가 없으므로 가짜 컨텍스트에서 새 클래스를 만들 수 없습니다.

누구나 CodeFirst 솔루션에서 DbEntityEntry를 조롱하거나 가짜로 만들었습니까?

또는 상태 변경을 처리하는 더 좋은 방법이 있습니까?

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; 
    } 
} 

그래서 대신 구현을 호출하는, 당신은 단지 SetModified 전화 : 그냥 다른 경우 같은

답변

83

는 당신이 필요로 간접의 추가 수준을 추가하는 것입니다.

+0

고마워요 ... 내가 필요하지 않을 때 "내가 어떻게 항목을 조롱합니까?"라고 생각하는 마음이 들었습니다. 수정 된 기능을 조롱 할 필요가 있습니다. 지금은 거의 당황 스럽습니다. – taylonr

+10

개발자가 "멋쟁이!" 순간 :-) –

+4

+9000 방금 내부 ctors 및 내부 클래스로 수업을 조롱하는 방법을 연구하는 데 시간을 보냈습니다. 나는 매 턴마다 방해 받고 있었고 그 해결책은 너무 간단합니다! asker와 answerer 모두에게 감사합니다. –