如何构建IOptionsMonitor <t>进行测试?

时间:2018-12-04 01:28:36

标签: dependency-injection configuration .net-core appsettings

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

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

4 个答案:

答案 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);