반응형
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>()));
반응형
'Programing' 카테고리의 다른 글
Android 에뮬레이터를 빠르게 조정하여 조정할 수 있습니까? (0) | 2020.12.05 |
---|---|
프록시를 사용하는 openssl s_client (0) | 2020.12.05 |
콘솔에서 자바 스크립트 함수 호출 (0) | 2020.12.05 |
CSS에서 @media 규칙 중첩 (0) | 2020.12.05 |
Delphi의 단위 테스트-어떻게하고 있습니까? (0) | 2020.12.05 |