Entity Framework에서 저장 프로 시저를 호출하는 함수가 있습니다.
public async Task<List<Entity>> GetEntity(int id)
{
var param = new SqlParameter("@id", id);
return await myContext.Database
.SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
.ToListAsync();
}
그리고 노력을 사용하여 단위 테스트를 만들고 싶습니다. 나는 이미 각 단위 테스트를 위해 Initialize
에서 데이터베이스 (내 컨텍스트 기반)를 시뮬레이트하기위한 Effort (및 NMemory 데이터베이스)를 가지고있다.
[TestInitialize]
public void Initialize()
{
Effort.Provider.EffortProviderConfiguration.RegisterProvider();
EffortProviderFactory.ResetDb()
using (var context = new MyContext("PWET"))
{
context.Database.CreateIfNotExists();
context.Constructeurs.Add(new Constructeur { Nom = "Zebra" });
context.Constructeurs.Add(new Constructeur { Nom = "Joya" });
context.SaveChanges();
}
}
EffortProviderFactory
:
public class EffortProviderFactory : IDbConnectionFactory
{
private static DbConnection _connection;
private readonly static object _lock = new object();
public static void ResetDb(){
lock (_lock){
_connection = null;
}
}
public DbConnection CreateConnection(string nameOrConnectionString)
{
lock (_lock){
if (_connection == null)
_connection = Effort.DbConnectionFactory.CreateTransient();
return _connection;
}
}
}
다음과 같이 저장 프로 시저 생성을 추가하여 테스트했습니다.
[TestInitialize]
public void Initialize()
{
Effort.Provider.EffortProviderConfiguration.RegisterProvider();
EffortProviderFactory.ResetDb()
using (var context = new MyContext("PWET"))
{
context.Database.CreateIfNotExists();
context.Database.ExecuteSqlCommand(@"
CREATE PROCEDURE [dbo].[myStoredProcedure]
@id INT = 0
AS
BEGIN
SELECT foo
FROM bar
WHERE foo.Id = @id
ORDER BY foo.Id;
END");
}
}
그러나 그것은 NotSupportedException
던집니다. 나는 어떻게 할 수 있고, 최선의 방법은 무엇인가?
Effort 는 DbContext
인스턴스에 개인 소유의 임시 데이터베이스 (새 컨텍스트, 새 데이터베이스, 테스트 상호 작용 없음)를 제공하는 파일 기반 메모리 내 데이터베이스 공급자입니다. 그것은 좋은 부분입니다.
단점은 물론 완전한 데이터베이스 엔진이 아니라는 것입니다. 따라서 일반적인 SQL 언어 (t-SQL 또는 PL-SQL과 같은)로 작성된 저장 프로 시저를 지원 하지 않습니다 . Effort (즉, NMemory)가 프로 시저를 저장하는 한 StoredProcedure
생성자 에서와 같이 저장된 IQueryable
일뿐입니다. t-SQL 저장 프로 시저와 관련된 원격주의.
데이터 액세스 계층 코드에서 저장 프로 시저를 테스트하는 유일한 방법은 통합 테스트를 작성하는 것입니다. 통합 테스트를 서로 독립적으로 만드는 데는 대략 두 가지 방법이 있습니다.
각 테스트에 대해 새 데이터베이스 만들기 / 시드
테스트 케이스가있는 기존 데이터베이스를 사용하고 각 테스트 후에 변경 사항을 롤백 합니다 (예 : TransactionScope 사용) .
통합 테스트는 단위 테스트만큼 빠른 것은 아니며 단위 테스트 만 보완 하지만 그럼에도 불구하고 데이터 계층과 관련한 자체 코딩 연습에서는 테스트 제품군의 일류 시민이되었습니다. 나를 위해 정확성이 속도보다 중요합니다.