【发布时间】:2020-03-13 22:03:06
【问题描述】:
我有一个自定义类用于读取 Azure Function App v2 中的配置值:
public class Config
{
public string Key1 { get; set; }
public string Key2 { get; set; }
public Config()
{
this.Key1 = Environment.GetEnvironmentVariable("abc");
this.Key2 = Environment.GetEnvironmentVariable("xyz");
}
}
我在Startup.cs 类的Configure 方法中注册,如下所示:
builder.Services.AddSingleton((s) =>
{
return new Config();
});
现在,当我尝试模拟这个 Config.cs 类并为其键设置值时,它会抛出错误:
var mockConfiguration = new Mock<Config>();
mockConfiguration.Setup(m => m.Key1).Returns("value");
我使用XUnit 作为测试框架,MOQ 用于模拟。如果我不想为类创建接口,我还能如何模拟我的配置类?
【问题讨论】:
-
当然它不会让你模拟它,因为属性是非虚拟的(我假设通过阅读错误消息你应该知道这一点)。模拟工作,通过继承类(或接口)并用模拟代码覆盖/实现属性。无论哪种方式,您都应该重构您的类以使其对重构更加友好,而接口是一种方法。如果您开始在代码的其他部分新建或使用静态类,您将越来越多地遇到此类导致软件设计不佳的问题。
-
还不清楚为什么你不使用选项模式(
IOptions<T>类和.Configure<Config>(options => options.Key1 = Environment.GetEnvironmentVariable("abc")),然后注入IOptions<Config>)到你的类中,你一开始就不会遇到这种情况地点
标签: c# asp.net-core moq xunit azure-function-app