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