簡體   English   中英

數據訪問層的最小起訂量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM