Dependency injection 如何构建IOptionsMonitor<;T>;用于测试?

Dependency injection 如何构建IOptionsMonitor<;T>;用于测试?,dependency-injection,configuration,.net-core,appsettings,Dependency Injection,Configuration,.net Core,Appsettings,对于普通IOptions接口,您可以手动构建实例,例如 是否有任何等效的方法可以在不使用DI的情况下生成IOptionsMonitor实例?您可以执行以下操作,然后将其用于测试: public class TestOptionsMonitor : IOptionsMonitor<MyOptions> { public TestOptionsMonitor(MyOptions currentValue) { Cur

对于普通IOptions接口,您可以手动构建实例,例如


是否有任何等效的方法可以在不使用DI的情况下生成IOptionsMonitor实例?

您可以执行以下操作,然后将其用于测试:

    public class TestOptionsMonitor : IOptionsMonitor<MyOptions>
    {
        public TestOptionsMonitor(MyOptions currentValue)
        {
            CurrentValue = currentValue;
        }

        public MyOptions Get(string name)
        {
            return CurrentValue;
        }

        public IDisposable OnChange(Action<MyOptions, string> listener)
        {
            throw new NotImplementedException();
        }

        public MyOptions CurrentValue { get; }
    } 
公共类测试选项监视器:IOptionsMonitor
{
公共测试选项监视器(MyOptions currentValue)
{
CurrentValue=CurrentValue;
}
公共MyOptions获取(字符串名称)
{
返回当前值;
}
公共IDisposable OnChange(操作侦听器)
{
抛出新的NotImplementedException();
}
公共MyOptions当前值{get;}
} 

哈纳尼尔的回答很好

以下是它的通用版本:

public class TestOptionsMonitor<T> : IOptionsMonitor<T>
    where T : class, new()
{
    public TestOptionsMonitor(T currentValue)
    {
        CurrentValue = currentValue;
    }

    public T Get(string name)
    {
        return CurrentValue;
    }

    public IDisposable OnChange(Action<T, string> listener)
    {
        throw new NotImplementedException();
    }

    public T CurrentValue { get; }
}
公共类测试选项监视器:IOptionsMonitor
其中T:class,new()
{
公共测试选项监视器(T currentValue)
{
CurrentValue=CurrentValue;
}
公共T获取(字符串名称)
{
返回当前值;
}
公共IDisposable OnChange(操作侦听器)
{
抛出新的NotImplementedException();
}
公共T CurrentValue{get;}
}

只需使用您的对象创建一个实例

我试着去模仿这个物体,这很容易。新的测试选项监视器

var options = new TestOptionsMonitor(new MyOptions{ Option1 = "Test" }); 
使用上面的测试选项Monitor,您就可以开始了。免责声明:如果您避免使用外部库,前面的答案就可以了!考虑一下这个,如果你想利用现有的图书馆来模拟你的东西!p> 如果使用
NSubstitute
库进行模拟,则可以通过执行以下操作模拟
IOptionsMonitor

//排列
var mockedOptions=Substitute.For();
mockedOptions.CurrentValue.Returns(新的BasicCredentialSchemaOptions(/*snip*/);
//表演
var result=mockOptions.CurrentValue;//不丢弃和发射NSubstitue的返回物
//断言
Assert.NotNull(结果);