模拟IOptionsMonitor

时间:2019-05-02 10:58:02

标签: c# asp.net-core integration-testing options asp.net-core-2.2

如何手动构造需要在构造函数中使用IOptionsMonitor的类的类实例?

我的班级

private readonly AuthenticationSettings _authenticationSettings;

public ActiveDirectoryLogic(IOptionsMonitor<AuthenticationSettings> authenticationSettings)
{            
   _authenticationSettings = authenticationSettings.CurrentValue;
}

我的测试

AuthenticationSettings au = new AuthenticationSettings(){ ... };
var someOptions = Options.Create(new AuthenticationSettings());
var optionMan = new OptionsMonitor(someOptions);  // dont work.           
ActiveDirectoryLogic _SUT = new ActiveDirectoryLogic(au);

我试图手动制作一个IOptionsMonitor对象,但不知道怎么做。

3 个答案:

答案 0 :(得分:5)

这是另一种方法,它不涉及尝试设置只读的CurrentValue字段。

using Moq;

private IOptionsMonitor<AppConfig> GetOptionsMonitor(AppConfig appConfig)
{
  var optionsMonitorMock = new Mock<IOptionsMonitor<AppConfig>>();
  optionsMonitorMock.Setup(o => o.CurrentValue).Returns(appConfig);
  return optionsMonitorMock.Object;
}

答案 1 :(得分:3)

您错误地调用了OptionsMonitor<TOptions>类的构造函数。

在这种情况下,我只会嘲笑IOptionsMonitor<AuthenticationSettings>界面

例如,使用最小起订量

AuthenticationSettings au = new AuthenticationSettings() { ... };
var monitor = Mock.Of<IOptionsMonitor<AuthenticationSettings>>(_ => _.CurrentValue == au);
ActiveDirectoryLogic _SUT = new ActiveDirectoryLogic(monitor);

答案 2 :(得分:1)

在NSubstitute中实现相同功能

        var optionsMonitorMock = Substitute.For<IOptionsMonitor<AuthenticationSettings>>();
        optionsMonitorMock.CurrentValue.Returns(new AuthenticationSettings
        {
            // values go here
        });