[英]Moq for the Data Access Layer
我有一個控制器。 從我呼叫的地方(BLL的DI)到業務邏輯層(BLL)。 從BLL,我通過另一個接口調用數據訪問層(DAL)。
DAL層構造函數與DBContext實例一起注入(此處未注入接口)。
因此,通過使用最小起訂量,我們可以測試控制器,BLL和中間層。 但是如何測試DLL層呢?
public class DAL():IDAL
{
private DBEntities entity;
public DAL(DBEntities DB)
{
entity = DB;
}
public list<string> ABC()
{
var a = SqlMapper.Query<class>(entity.Database.Connection, "",param,commandType: CommandType.StoredProcedure).ToList();
return a;
}
}
基本上我的查詢如何在這里模擬什么? 在這里,我們實現了IDAL,但這里沒有注入它。
這個問題對我來說仍然不是100%清楚,但我嘗試給出一個答案。
無需模擬DBEntities
。 如果要確保查詢返回正確的結果,請使用眾所周知的預填充數據庫(僅用於測試)對其進行測試。
如果您想測試業務邏輯並需要模擬數據訪問層,那么模擬將很有幫助! 因此,使用您的方法創建一個接口:
public interface IDAL
{
List<string> ABC();
}
在單元測試中,您可以使用以下方法模擬接口:
var dataAccessMock = new Mock<IDAL>();
dataAccessMock.Setup(x => x.ABC()).Returns(new List<string> {"ABC", "DEF", "GHI" });
// get an IDAL instance which you can inject / use
var mockedInstance = dataAccessMock.Object;
// get the mocked list
var list = mockedInstance.ABC();
您可以在InMemoryDb的DAL實例的測試類的構造函數中模擬和創建,這將是您數據庫的空模式,而不是使用一些測試所需的數據來對它進行存儲,然后檢查您的查詢。 這就是我的方法。
public class SomeTests : IDisposable
{
public SomeTests()
{
var options = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
_dbContext = new MyContext(options);
_dbContext.Database.EnsureDeleted();
_dbContext.Database.EnsureCreated();
// you can provide some more settings here
}
public void Dispose()
{
_dbContext?.Dispose();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.