Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟IOptionsSnapshot实例进行测试_C#_Unit Testing_Asp.net Core_Moq_Asp.net Core 1.1 - Fatal编程技术网

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"
    }
});