Effort.EF6을 사용하여 열망하는로드 시나리오 테스트

c# effort entity-framework unit-testing

문제

우리는 Effort.EF6 을 사용하여 메모리 내 데이터베이스에 작동하는 ASP.NET Web API 2 서비스 용 테스트 제품군을 구축했으며, 대부분 멋진 경험을합니다.

그러나이 질문과 무관 한 이유로 EF6에서 (DB 컨텍스트의 생성자에서 Configuration.LazyLoadingEnabled = false; 를 실행하여) 지연로드를 해제해야합니다 Configuration.LazyLoadingEnabled = false; 즉, .Include() 관계를 잊어 버리면 어딘가에 나중에 사용하면 NullReferenceExceptions 합니다. 테스트에서 이러한 유형의 오류가 발생하기를 바랍니다.

테스트 설정은 기본적으로 다음과 같습니다.

  1. Effort의 연결 팩토리를 사용하여 db 연결을 만듭니다. 이것은 테스트마다 고유 한 연결 인스턴스 (영구 연결로 시도 할 때 고유 키 사용)입니다.
  2. 해당 연결로 db 컨텍스트를 작성하고 테스트를 위해 존재할 데이터를 추가하십시오.
  3. DI 컨텍스트에 대한 DI 컨테이너에 서비스 오버라이드를 등록하십시오.

문제는 Effort.EF6을 지연로드를 허용하지 않도록 구성하는 방법을 알아낼 수 없다는 것입니다. 테스트 환경의 컨텍스트에 추가 한 항목은 테스트중인 코드가 실행될 때 이미로드되어 있으므로 절대로로드되지 않습니다. 예외를보십시오. 테스트 설정과 실제 코드 실행 사이에 컨텍스트 인스턴스를 다시 사용하기 때문에 이것이라고 가정합니다.

세 번째 단계를 다음과 같이 전환하려고 시도하면

  1. DI 연결에서 db 연결에 대한 서비스 재정의를 등록하십시오.
  2. DI 컨테이너는 db 컨텍스트 인스턴스를 만듭니다 (db 연결을 주입 된 종속성으로 사용)

우리는 대신 db 컨텍스트로 끝납니다. 즉, 테스트를 실행하기 전에 몇 가지 데이터 요소를 추가하더라도 데이터가 없습니다.

Effort를 사용하여 db 컨텍스트를 구성하고 삽입 할 수있는 방법은 .Include() 문이 누락 .Include() 실패하면 실패하지만 거기에있는 경우 사용할 수 있습니까?

수락 된 답변

Effort.EF6의 생성자에서도 DbConnection 개체를 사용하는 생성자에서 해당 개체를 비활성화해야합니다.

나는 다음과 같이 EF Code First 프로젝트를 위해 그것을 해결했다.

public class MyDataContext : DbContext, IMyDataContext
{
    /*
    * the ohter stuff like IDbSet<T> etc.
    */


    public MyDataContext() : base("name=MyConnectionString")
    {
        Configure();
    }

    /// <summary>
    /// This constructor is for test usage only!
    /// </summary>
    /// <param name="connection">Test connection for in memory database</param>
    public MyDataContext(DbConnection connection) : base(connection, true)
    {
        Configure();
    }


    /// <summary>
    /// Configures the data context.
    /// </summary>
    private void Configure()
    {
        Configuration.LazyLoadingEnabled = false;
    }
}

또한 테스트 프로젝트에서 테스트 CSV 파일을 설정하고 있습니다. 파일은 Effort.EF6에서 시드 된 데이터로 컨텍스트를 인스턴스화하는 데 사용됩니다. 필자의 경우 특정 테이블에 특정 파일을 시드 할 가능성을 제공하는 작은 TestDataManager를 작성했습니다.

다음은 Effort.EF6을 사용하여 데이터를 시드하는 방법을 보여주는 코드입니다.

public class MyDataContext : DbContext, IMyDataContext
{
    /*
    * the ohter stuff like IDbSet<T> etc.
    */


    public MyDataContext() : base("name=MyConnectionString")
    {
        Configure();
    }

    /// <summary>
    /// This constructor is for test usage only!
    /// </summary>
    /// <param name="connection">Test connection for in memory database</param>
    public MyDataContext(DbConnection connection) : base(connection, true)
    {
        Configure();
    }


    /// <summary>
    /// Configures the data context.
    /// </summary>
    private void Configure()
    {
        Configuration.LazyLoadingEnabled = false;
    }
}

어쩌면이 블로그 게시물 도 도움이 될 것입니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.