数据访问层的最低订购量

时间:2018-09-20 07:18:17

标签: c# moq dapper

我有一个控制器。从我呼叫的地方(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,但这里没有注入。

2 个答案:

答案 0 :(得分:1)

这个问题对我来说仍然不是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();

答案 1 :(得分:0)

您可以为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();
        }
}