使用将 IOptions<T> 作为构造函数参数的 Autofixture 测试控制器

Test a controller using Autofixture that takes IOptions<T> as constructor parameter

控制器class:

private readonly DbSettings _docDbSettings;

public CoursesController(IOptions<DbSettings> docDbSettings)
{
    if (docDbSettings == null) throw new ArgumentNullException(nameof(docDbSettings));
    _docDbSettings = docDbSettings.Value;
}

控制器测试class:

public class CoursesControllerTests
{
    private readonly IFixture _fixture;
    private readonly CoursesController _coursesController;
    private readonly DbSettings _docDbSettings;

    public CoursesControllerTests()
    {
        _fixture = new Fixture().Customize(new AutoFakeItEasyCustomization());

        // Need help here.
        _docDbSettings = _fixture.Create<IOptions<DbSettings>>();       
    }
}

错误:

Cannot implicitly convert type 'Microsoft.Extensions.Options.IOptions<Infrastructure.DbSettings>' to 'Infrastructure.DbSettings'

任何线索!

提前致谢。

您似乎试图将 _fixture.Create<IOptions<DbSettings>>() 返回的 IOptions<DbSettings> 类型的对象分配给 DbSettings 类型的变量,而这些类型不是 兼容.

您可以将 _docDbSettings 的类型更改为 IOptions<DbSettings> 或使用 AutoFixture 创建一个 DbSettings 对象,方法是:

_docDbSettings = _fixture.Create<DbSettings>();

顺便说一下,很高兴知道 AutoFixture 可以作为 auto-mocking container 工作,这意味着您可以要求它创建您的 CourseController 的实例,AutoFixture 将确保提供参数对于所有构造函数依赖项,在本例中为 IOptions<DbSettings>:

var systemUnderTest = _fixture.Create<CourseController>();

您可以在 Mark Seemann 的 this article 中阅读有关如何将此模式与 AutoFixture 结合使用的更多信息。