programing

Entity Framework를 사용한 단위 테스트

nasanasas 2020. 11. 2. 08:04
반응형

Entity Framework를 사용한 단위 테스트


Entity Framework를 사용하여 빌드 된 엔터티를 테스트하고 싶습니다. 내 관심사는 Entity Framework를 사용하는 것이 데이터 소스로 직접 작업하는 것을 의미한다는 것입니다. 그렇다면 Entity Framework 기반 구성 요소를 단위 테스트하는 방법에 대한 아이디어가 있습니까?


Enity Framework 4의 경우 이는 유망 해 보입니다. Testability 및 Entity Framework 4.0


분명히 그것은 매우 어렵습니다. Eloquently 여기에 Erik이 넣음-TDD 및 ADO.NET Entity Framework


저렴한 방법은 실제 데이터베이스와 동일한 구조로 데이터베이스 파일을 설정하고이를 가리 키도록 단위 테스트 구성의 연결 문자열을 설정하는 것입니다. 데이터베이스는 실제 테이블이 가지고있는 모든 테이블을 가질 필요는 없습니다. 단위 테스트에 필요한 것입니다.

단점은 단위 테스트가 실행 중 또는 실행 사이에 서로 영향을 미치지 않도록 데이터베이스의 상태를 관리해야한다는 것입니다.

이 접근 방식은 실제 DB와 단위 테스트 DB가 모두 SQL Express를 사용할 때 작동한다는 것을 알고 있지만 전체 SQL DB를 위해 SqlExpress DB에서 스터 빙하는 방법을 모릅니다.

기술적으로 통합 테스트라는 것을 알고 있지만 코드를 리팩토링하거나 모의 프레임 워크를 배우는 것보다 저렴할 수 있습니다.

실제 연결 문자열의 예 :

<add name="DrinksEntities" 
     connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient
     ;provider connection string=&quot;Data Source=localhost\sqlexpress;Initial Catalog=Drinks2;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" />

단위 테스트 연결 문자열의 예 :

<add name="DrinksEntities" 
     connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient
     ;provider connection string=&quot;Data Source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\Inventory.mdf;Integrated Security=True;user instance=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" />

실제 데이터를 조회하는 대신 모의 프레임 워크를 사용하여 모의 값을 검색하려고합니다. 다음은 시작하는 데 도움이되는 몇 가지 조롱 프레임 워크 및 일부 스크린 캐스트 링크 목록입니다.

시작하는 방법에 대한 스크린 캐스트는 다음과 같습니다.


이것에 대한 또 다른 의견을 공유하고 싶습니다. TypeMock Isolator를 사용하여 Entity Framework 기반 구성 요소와 응용 프로그램도 테스트 할 수있었습니다. 그러나 그것은 상업적입니다.

이 게시물을 살펴보십시오 : TypeMock Isolator를 사용한 Entity Framework 단위 테스트 소개


Entity Framework 버전 1은 몇 가지 주요 소프트웨어 디자인 원칙을 위반하기 때문에 응용 프로그램에서 TDD를 사용할 때 실제로 TDD를 적용 할 방법이 없습니다. 내 연구는 즉각적인 해결책을 찾고 있다면 NHibernate를 가리 킵니다. 단위 테스트를 염두에두고 설계되었습니다.

그러나 기다릴 수 있다면 다음 릴리스의 Entity Framework : Entity Framework 4.0을 사용한 테스트 주도 개발 연습에 대한 희망이있는 것 같습니다.


예제는 매우 단순 할 수 있지만이 문제에 대한 가능한 해결책을 논의하려고 시도했습니다. 그것은 우려의 분리와 우리의 친애하는 친구 종속성 주입을 포함합니다.

http://devblog.petrellyn.com/

자세한 내용을 원하시면 저에게 연락하십시오.


동의합니다. 조롱하는 프레임 워크는 당신이 추구하는 것입니다. 데이터 소스에서 검색되지 않은 "모의"개체를 만들고 해당 개체의 데이터를 테스트합니다. 저는 개인적으로 Moq와 함께 일 해왔고, Rhinomocks와 다른 사람들도 있습니다.


이것에 대한 많은 좌절 끝에 마침내 적어도 문제의 일부에 대해 만족할만한 해결책을 얻었습니다.

먼저 다음과 같은 저장소 인터페이스를 사용하십시오.

public interface IRepository
{
    IQueryable<T> GetObjectSet<T>();
}

메모리 내 컬렉션 또는 실제 DB 지원 컬렉션을 반환하는 데 사용할 수 있습니다. 다음으로 다음과 같은 인터페이스를 사용하여 쿼리를 쿼리 개체로 캡슐화합니다.

public interface IQuery<T>
{
    IQueryable<T> DoQuery(IQueryable<T> collection);
}

이제 단위 테스트를 두 그룹으로 나눕니다. 첫 번째 그룹은 쿼리가 유효한지 테스트합니다. 이렇게하세요 :

[TestMethod]
public void TestQueryFoo()
{
     using(var repo = new SqlRepository("bogus connection string"))
     {
         var query = new FooQuery(); // implements IQuery<Foo>
         var result = query.DoQuery(repo.GetObjectSet<Foo>());  // as long as we don't enumerate the IQueryable EF won't notice that the connection string is bogus
         var sqlString = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); // This will throw if the query can't be compiled to SQL
     }
}

두 번째 단위 테스트 세트는 지금까지 가장 큰 문제가 발생하는 SQL 컴파일 단계에 대해 걱정하지 않고 비즈니스 로직을 자유롭게 테스트 할 수 있습니다.

상상력의 확장으로 완벽하지 않으며 트리거가 실행되지 않고 DB 구현 제약 조건을 위반할 수 있으며 컨텍스트 및 데이터베이스가 동기화되지 않는 일부 문제가 발생할 수 있습니다. 따라서 종단 간 통합 테스트가 여전히 필요하지만 간단한 단위 테스트에서 런타임에 발생하는 가장 일반적인 문제인 IMO를 파악하는 것이 가능합니다.


The BookLibrary sample application of the WPF Application Framework (WAF) project shows how an Entity Framework based application can be unit tested.


Here's an aggregation of the unit of work pattern+ in-memory database + t4 code generation to automatically generate a fake EF dbContext.

http://mockingcompetence.wordpress.com/2013/05/20/fakingefdatacontext/

there are some issues(invalid linq to EF queries and no FK enforcement) with exactly replicating a real EF db connection at this time.

However, having an in-memory context to quickly run unit tests is almost essential to being able to do TDD or any other kind of unit testing centric approach.

I will be posting updates to the above link as I figure out more of the issues.


You could use in-memory data base for testing your Entity Framework model. Look here for more details


How about using a mocking framework? It seems to me that a mocking framework can help you isolaye your business logic from the database.

참고URL : https://stackoverflow.com/questions/326450/unit-testing-with-entity-framework

반응형