如何使用最小起订量模拟 IConfiguration?
How do I mock IConfiguration with Moq?
如何在我的单元测试中模拟这样的代码。我在 asp.net 核心 5 中使用 xUnit 和 Moq。我是 xUnit 和 Moq 的新手。
var url = configuration.GetSection("AppSettings").GetSection("SmsApi").Value;
配置对象已经注入到构造函数中。
这是我目前的单元测试class
public class UtilityTests
{
private readonly Utility sut;
public UtilityTests()
{
var mockConfig = new Mock<IConfiguration>();
var mockConfigSection = new Mock<IConfigurationSection>();
//mockConfigSection.Setup(x => x.Path).Returns("AppSettings");
mockConfigSection.Setup(x => x.Key).Returns("SmsApi");
mockConfigSection.Setup(x => x.Value).Returns("http://example.com");
mockConfig.Setup(x => x.GetSection("AppSettings")).Returns(mockConfigSection.Object);
sut = new Utility(mockConfig.Object);
}
[Fact]
public void SendSmsShdReturnTrue()
{
var fixture = new Fixture();
var result = sut.SendSms(fixture.Create<string>(), fixture.Create<string>());
result.Should().BeTrue();
}
}
替代方法 tp 引入一个 class 来表示配置部分,然后使用 IOptions
接口将其注入构造函数。
您的测试无需模拟即可轻松配置,只需创建一个实例并将其传递给构造函数即可。
如下所示:
class SmsApiSettings
{
public string Url { get; set; }
}
启动时注册
services.Configure<SmsApiSettings>(Configuration.GetSection("SmsApi"));
构造函数
public class ClassUnderTest
{
private readonly SmsApiSettings _smsApiSettings;
public ClassUnderTest(IOptions<> smsOptions)
{
_smsApiSettings = smsOptions.Value;
}
}
测试
var settings = new SmsApiSettings { Url = "http://dummy.com" };
var options = Options.Create(settings);
var sut = new ClassUnderTest(options);
享受没有嘲笑的幸福生活;)
事实是 IConfiguration
不应该被嘲笑。相反,它应该是 built.
通过字典
数据
var configForSmsApi = new Dictionary<string, string>
{
{"AppSettings:SmsApi", "http://example.com"},
};
用法
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(configForSmsApi)
.Build();
通过json 文件
数据
{
"AppSettings": {
"SmsApi": "http://example.com"
}
}
用法
var configuration = new ConfigurationBuilder()
.AddJsonFile("smsapi.json", optional: false)
.Build();
如何在我的单元测试中模拟这样的代码。我在 asp.net 核心 5 中使用 xUnit 和 Moq。我是 xUnit 和 Moq 的新手。
var url = configuration.GetSection("AppSettings").GetSection("SmsApi").Value;
配置对象已经注入到构造函数中。
这是我目前的单元测试class
public class UtilityTests
{
private readonly Utility sut;
public UtilityTests()
{
var mockConfig = new Mock<IConfiguration>();
var mockConfigSection = new Mock<IConfigurationSection>();
//mockConfigSection.Setup(x => x.Path).Returns("AppSettings");
mockConfigSection.Setup(x => x.Key).Returns("SmsApi");
mockConfigSection.Setup(x => x.Value).Returns("http://example.com");
mockConfig.Setup(x => x.GetSection("AppSettings")).Returns(mockConfigSection.Object);
sut = new Utility(mockConfig.Object);
}
[Fact]
public void SendSmsShdReturnTrue()
{
var fixture = new Fixture();
var result = sut.SendSms(fixture.Create<string>(), fixture.Create<string>());
result.Should().BeTrue();
}
}
替代方法 tp 引入一个 class 来表示配置部分,然后使用 IOptions
接口将其注入构造函数。
您的测试无需模拟即可轻松配置,只需创建一个实例并将其传递给构造函数即可。
如下所示:
class SmsApiSettings
{
public string Url { get; set; }
}
启动时注册
services.Configure<SmsApiSettings>(Configuration.GetSection("SmsApi"));
构造函数
public class ClassUnderTest
{
private readonly SmsApiSettings _smsApiSettings;
public ClassUnderTest(IOptions<> smsOptions)
{
_smsApiSettings = smsOptions.Value;
}
}
测试
var settings = new SmsApiSettings { Url = "http://dummy.com" };
var options = Options.Create(settings);
var sut = new ClassUnderTest(options);
享受没有嘲笑的幸福生活;)
事实是 IConfiguration
不应该被嘲笑。相反,它应该是 built.
通过字典
数据
var configForSmsApi = new Dictionary<string, string>
{
{"AppSettings:SmsApi", "http://example.com"},
};
用法
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(configForSmsApi)
.Build();
通过json 文件
数据
{
"AppSettings": {
"SmsApi": "http://example.com"
}
}
用法
var configuration = new ConfigurationBuilder()
.AddJsonFile("smsapi.json", optional: false)
.Build();