【发布时间】:2020-06-21 19:14:58
【问题描述】:
研究: Mocking IConfiguration from .NET Core
我需要对我的数据访问层进行集成测试,以确保所有代码都能正常工作。
我知道用正常的方式是行不通的:
//Will return a NotSupportedException
var mock = new Mock<IConfiguration>();
mock.Setup(arg => arg.GetConnectionString(It.IsAny<string>()))
.Returns("testDatabase");
通常数据访问层使用依赖注入,它使用IConfiguration检索连接字符串。
我的集成测试:
[Fact]
public async void GetOrderById_ScenarioReturnsCorrectData_ReturnsTrue()
{
// Arrange
OrderDTO order = new OrderDTO();
// Mocking the ASP.NET IConfiguration for getting the connection string from appsettings.json
var mockConfSection = new Mock<IConfigurationSection>();
mockConfSection.SetupGet(m => m[It.Is<string>(s => s == "testDB")]).Returns("mock value");
var mockConfiguration = new Mock<IConfiguration>();
mockConfiguration.Setup(a => a.GetSection(It.Is<string>(s => s == "ConnectionStrings:testDB"))).Returns(mockConfSection.Object);
IDataAccess dataAccess = new SqlDatabase(mockConfiguration.Object);
IRepository repository = new repository(dataAccess, connectionStringData);
var connectionStringData = new ConnectionStringData
{
SqlConnectionLocation = "testDatabase"
};
// Act
int id = await repository.CreateOrder(order);
// Assert
Assert.Equal(1, id);
}
但我得到一个错误
System.InvalidOperationException:ConnectionString 属性尚未初始化。
我有点迷路了,我不确定发生了什么。
【问题讨论】:
-
我建议找到一种不同的方式将连接字符串传递到数据层...直接或通过选项对象(我不是必然表示 IOptions ) 。虽然它是一个接口,但在 IConfiguration 上仍然存在紧密耦合,强制使用要求连接字符串位于特定键/子键中。它还限制在 IConfiguration 和适当的包可用的情况下使用它
标签: c# unit-testing asp.net-core moq