代码之家  ›  专栏  ›  技术社区  ›  Codehelp

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

  •  1
  • Codehelp  · 技术社区  · 6 年前

    控制器类:

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

    控制器测试类:

    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'
    

    任何线索!

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Enrico Campidoglio    6 年前

    好像你想分配一个类型的对象 IOptions<DbSettings> 退回人 _fixture.Create<IOptions<DbSettings>>() 类型的变量 DbSettings 当那些类型不是 .

    _docDbSettings 或创建一个 D设置 用AutoFixture表示:

    _docDbSettings = _fixture.Create<DbSettings>();
    

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

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

    您可以阅读有关如何将此图案与中的AutoFixture一起使用的更多信息 this article 作者:马克·西曼。