【问题标题】:How to mock GetConnectionString() from IConfiguration using moq?如何使用 moq 从 IConfiguration 模拟 GetConnectionString()?
【发布时间】: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


【解决方案1】:

尝试改变:

 mockConfiguration.Setup(a => a.GetSection(It.Is<string>(s => s == "ConnectionStrings:testDB"))).Returns(mockConfSection.Object);

收件人:

 mockConfiguration.Setup(a => a.GetSection(It.Is<string>(s => s == "ConnectionStrings"))).Returns(mockConfSection.Object);

下一个设置打印“模拟值”:

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"))).Returns(mockConfSection.Object);

Console.WriteLine(mockConfiguration.Object.GetConnectionString("testDB")); // prints "mock value"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2010-10-19
    • 2016-09-30
    • 2019-10-06
    • 2020-10-27
    • 2012-06-01
    • 2018-12-27
    • 2019-06-16
    相关资源
    最近更新 更多