Programing

DbEntityEntry를 조롱 또는 위조하거나 새 DbEntityEntry 생성

crosscheck 2020. 12. 5. 09:17
반응형

DbEntityEntry를 조롱 또는 위조하거나 새 DbEntityEntry 생성


내 다른의 발 뒤꿈치에 따라 DbContext.Set 조롱에 대한 질문 I의 한은 EF 코드 먼저 조롱에 대한 또 다른 질문이 있어요.

이제 다음과 같은 업데이트 방법이 있습니다.

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.

이 코드를 단계별로 수행했으며 Context 인터페이스의 구현으로 실제 라이브 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.


Moq자체 인터페이스가 필요하지 않은 단위 테스트가 필요할 때이 질문을 찾았습니다 . 특정 필드를 수정하지 않도록 설정하고 싶었지만 메서드 SetModified는 객체와 함께 사용할 수도 있습니다.

DbContext :

public class AppDbContext : DbContext
{   
    ...
    public virtual void SetModified(GuidEntityBase entity)
    {
        Entry(entity).State = EntityState.Modified;
        Entry(entity).Property(x => x.CreatedDate).IsModified = false;
        Entry(entity).Property(x => x.CreatedBy).IsModified = false;
    }
    ...
}

테스트:

var mockContext = new Mock<AppDbContext>();
mockContext.Setup(c => c.MyDbSet).Returns(mockMyDbSet.Object);
mockContext.Setup(c => c.SetModified(It.IsAny<GuidEntityBase>()));

참고 URL : https://stackoverflow.com/questions/5035323/mocking-or-faking-dbentityentry-or-creating-a-new-dbentityentry

반응형