对于普通的IOptions接口,您可以手动构建实例,例如this SO question。
是否有任何等效方法可以在不使用DI的情况下创建IOptionsMonitor实例?
答案 0 :(得分:3)
您可以执行以下操作,然后将其用于测试:
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; }
}
答案 1 :(得分:0)
Hananie的好答案
这是它的通用版本:
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; }
}
只需使用对象创建一个实例!
答案 2 :(得分:0)
我很想模拟对象,这很容易。只是新建一个TestOptionsMonitor
var options = new TestOptionsMonitor(new MyOptions{ Option1 = "Test" });
使用上面的TestOptionsMonitor,您会很好
答案 3 :(得分:0)
免责声明:如果您避免使用外部库,则前面的答案就可以解决问题!如果您想利用现有库为您模拟内容,请考虑这个!
如果您使用 NSubstitute
库进行 Mocking,您可以通过执行以下操作来模拟 IOptionsMonitor
:
// Arrange
var mockedOptions = Substitute.For<IOptionsMonitor<BasicCredentialSchemaOptions>>();
mockedOptions.CurrentValue.Returns(new BasicCredentialSchemaOptions(/*snip*/));
// Act
var result = mockOptions.CurrentValue; // Does not throw and fires off NSubstitue's Returns
// Assert
Assert.NotNull(result);