2009-03-25 11 views
7

좋은 디자인상의 이유 때문에 DbConnections에서 작업을 수행해야하는 몇 가지 .NET 클래스를 단위 테스트하려고합니다. 이 테스트에서는 메모리에 특정 클래스의 데이터를 입력합니다.Db없이 Db를 사용하지 않고 메모리 내 DataSet (또는 비슷한 것)을 소스로 사용합니다.

메모리 내 데이터는 DataTable (또는 해당 DataTable을 포함하는 DataSet)으로 쉽게 표현 될 수 있지만 다른 클래스가 더 적절하면 사용할 수 있습니다.

메모리 내 데이터에 대한 연결을 나타내는 DbConnection을 어떻게 든 마술로 얻을 수 있다면 개체를 만들고 메모리 내 데이터에 대해 쿼리를 실행하고 결과가 일치하도록 할 수있었습니다 기대. DbConnection을 메모리 내 데이터로 가져 오는 방법이 있습니까? 필자는 타사 소프트웨어를 설치할 자유가 없기 때문에 테스트 중에 디스크를 만지지 않는 것이 이상적입니다.

답변

6

DbConnection을 사용하기보다는 IDbConnection을 소비하고 조롱 할 수 있습니까? 우리는 비슷한 것을하고, 모의 데이터 세트를 전달합니다. DataSet.CreateDataReader는 DbDataReader에서 상속 한 DataTableReader를 반환합니다.

우리는 DbDataReader와 동일한 인터페이스를 구현하는 클래스를 반환하는 ExecuteReader() 메서드를 추가 한 자체 IDbConnection 형 인터페이스에서 DbConnection을 래핑했습니다. 우리의 모의에서 ExecuteReader는 단순히 DataSet.CreateDataReader가 제공하는 것을 반환합니다.

로터리의 종류는 들리 겠지만 가능한 많은 결과 집합으로 된 DataSet을 구축하는 것이 매우 편리합니다. 우리는 결과를 나타내는 저장된 procs 다음에 DataTable의 이름을 지정하고 IDbConnection 모의에서는 클라이언트가 호출하는 proc를 기반으로 올바른 Datatable을 가져옵니다. DataTable은 또한 CreateDataReader를 구현하므로 좋은 결과를 얻을 수 있습니다.

0

TypeMock? (당신이 그것을 '설치'해야합니다).

데이터 *가 테스트를위한 적절한 고리를 제공 할 수 있다는 점을 유의하십시오. 일반적으로 꽤 최악의 경우입니다. 하지만 당신은 Good Design Reasons라고 말합니다. D

3

내가 사용한 접근법은 메모리 내 Sqlite 데이터베이스를 만드는 것입니다. 이 작업은 System.Data.SQLite.Core NuGet 패키지를 유닛 테스트 프로젝트로 끌어 들이기 만하면 간단히 수행 할 수 있습니다. 다른 곳에서는 소프트웨어를 설치할 필요가 없습니다.

정말 분명한 생각처럼 들리지만, 내가 직접 기술을 사용한다고 생각했던 Dapper 단위 테스트를 볼 때까지는 그렇지 않았습니다. 당신은 메모리 SQLite는 DB를 생성하고 생성하고 테이블을 채우는 경우, 당신은하지 전에 연결을 닫습니다주의해야한다는 것입니다주의해야 할

https://github.com/StackExchange/dapper-dot-net/blob/bffb0972a076734145d92959dabbe48422d12922/Dapper.Tests/Tests.cs

한 가지에서 "GetSqliteConnection"방법을 참조하십시오 새로운 인 메모리 연결을 열면 새로운 메모리에 이 아닌 인 메모리에 연결됩니다. 테스트를 위해 조심스럽게 준비한 데이터베이스는이 아닙니다. 일부 테스트의 경우이 함정을 피하기 위해 연결을 계속 유지하는 사용자 지정 IDbConnection 구현을 사용합니다.

https://github.com/ProductiveRage/SqlProxyAndReplay/blob/master/Tests/StaysOpenSqliteConnection.cs

관련 문제