C# 如何模拟IOptionsSnapshot实例进行测试
我有一个类C# 如何模拟IOptionsSnapshot实例进行测试,c#,unit-testing,asp.net-core,moq,asp.net-core-1.1,C#,Unit Testing,Asp.net Core,Moq,Asp.net Core 1.1,我有一个类AbClass,它是通过IOptionsSnapshot(动态配置)的asp.net核心内置DI实例获得的。 现在我想测试这个类 我试图在测试类中实例化AbClass类,但我不知道如何实例化IOptionsSnapshot的实例以注入到AbClass的构造函数中 我尝试使用Mock.Object,但我需要为此实例设置一些值,因为在AbClass中,代码正在使用这些值(var x=\u options.cc.D1) 所以我有一个类似的代码 var builder = new Config
AbClass
,它是通过IOptionsSnapshot
(动态配置)的asp.net核心内置DI实例获得的。
现在我想测试这个类
我试图在测试类中实例化AbClass
类,但我不知道如何实例化IOptionsSnapshot
的实例以注入到AbClass
的构造函数中
我尝试使用Mock.Object
,但我需要为此实例设置一些值,因为在AbClass中,代码正在使用这些值(var x=\u options.cc.D1
)
所以我有一个类似的代码
var builder = new ConfigurationBuilder();
builder.AddInMemoryCollection(new Dictionary<string, string>
{
["Ab:cc:D1"] = "https://",
["Ab:cc:D2"] = "123145854170887"
});
var config = builder.Build();
var options = new AbOptions();
config.GetSection("Ab").Bind(options);
并且需要测试
AbClass
中调用x()
的方法,但是当它打开\u options.cc.D1
时,它会抛出ArgumentNullException
,您应该能够模拟接口并为测试创建options类的实例。由于我不知道options类的嵌套类,所以我做了一个广泛的假设
//排列
//实例化选项和嵌套类
//在这里假设嵌套类型
var options=newaboptions(){
cc=新cc{
D1=“https://”,
D2=“123145854170887”
}
};
var mock=new mock();
mock.Setup(m=>m.Value).返回(选项);
var服务=新的AbClass(mock.Object);
对嵌套值的访问现在应该返回正确的值,而不是以常规方式返回NRE:
public static IOptionsSnapshot<T> CreateIOptionSnapshotMock<T>(T value) where T : class, new()
{
var mock = new Mock<IOptionsSnapshot<T>>();
mock.Setup(m => m.Value).Returns(value);
return mock.Object;
}
好问题!使用
IOptions
时,在Options
类上有一个静态的Create
方法,但是对于IOptionsSnapshot
,没有类似的方法跳出来攻击我。我很好奇答案是什么。
var service = new AbClass(new Mock???)
//Arrange
//Instantiate options and nested classes
//making assumptions here about nested types
var options = new AbOptions(){
cc = new cc {
D1 = "https://",
D2 = "123145854170887"
}
};
var mock = new Mock<IOptionsSnapshot<AbOptions>>();
mock.Setup(m => m.Value).Returns(options);
var service = new AbClass(mock.Object);
public static IOptionsSnapshot<T> CreateIOptionSnapshotMock<T>(T value) where T : class, new()
{
var mock = new Mock<IOptionsSnapshot<T>>();
mock.Setup(m => m.Value).Returns(value);
return mock.Object;
}
var mock = CreateIOptionSnapshotMock(new AbOptions(){
cc = new cc {
D1 = "https://",
D2 = "123145854170887"
}
});