在Effort數據庫上為單元測試創建存儲過程


我有一個函數使用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();
}

我想使用Effort為它創建一個單元測試。我已經有Effort(和NMemory數據庫)模擬數據庫(基於我的上下文),在每個單元測試的Initialize ,如:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

EffortProviderFactory在哪裡:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

我測試了添加存儲過程創建,如下所示:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

但它會拋出NotSupportedException 。我該怎麼辦,最好的方法是什麼?

一般承認的答案

Effort是一個基於文件的內存數據庫提供程序,它為DbContext實例提供私有的臨時數據庫:新上下文,新數據庫,無測試交互。那是好事。

當然,缺點是它不是 - 而且永遠不會 - 是一個成熟的數據庫引擎。因此,它永遠不會支持用任何常見SQL方言(如t-SQL或PL-SQL)編寫的存儲過程。就Effort(即NMemory)存儲過程而言,它只是一個存儲的IQueryable ,從StoredProcedure構造函數中可以看出。注意與t-SQL存儲過程遠程相關。

在數據訪問層代碼中測試存儲過程的唯一方法是編寫集成測試,這是一個非常好的想法。大致有兩種方法可以使集成測試彼此獨立:

  • 為每個測試創建/播種新數據庫

  • 使用包含測試用例的現有數據庫並在每次測試後回滾更改, 例如使用TransactionScope

集成測試永遠不會像單元測試一樣快,它們只是對單元測試的補充 ,但是,在我自己的與數據層相關的編碼實踐中,它們已經成為測試套件中的一等公民。對我來說,正確性比速度更重要。





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因