AutoFixture和私有属性

时间:2014-03-28 08:12:14

标签: c# autofixture

我是否可以指示AutoFixture填写所有类的特定属性(如Ninject.Inject)注释的私有属性?源似乎只扫描公共属性:1。此问题为具有私有设置器的特定MyClass提供了解决方案,但不针对私有属性或所有类:2

我使用Moq来模拟服务,最后我想用这些模拟来填充属性。如果我将MyService依赖项公开为public,则以下设置可以正常工作。

一些示例代码:

public class MyController {
    [Inject]
    private IMyService MyService { get; set; }

    public void AMethodUsingMyService() {
        MyService.DoSomething();
        // ...
    }

    // ...
}

public class MyService : IMyService {
    public void DoSomething()
    {
        // ...
    }

    // ...
}

public class MyControllerTest {
    [Theory]
    [AutoMoqData]
    public void MyTest(MyController controller) {
        controller.AMethodUsingMyService();
    }
}

1 个答案:

答案 0 :(得分:9)

AutoFixture没有内置支持将值分配给非公共字段或属性。这是设计的。

AutoFixture是一个用于单元测试的实用程序库,以及shouldn't directly invoke private members的单元测试SUT

AutoFixture最初是作为测试驱动开发(TDD)的工具而构建的,而TDD则是关于反馈的。本着GOOS的精神,你应该听听你的测试。如果测试难以编写,则应考虑API设计。 AutoFixture倾向于放大这种反馈,所以我的第一反应是挑战想要这样做的动机。

由于您正在引用NInject,看起来好像您正在使用依赖注入(DI)。然而,私人房产注入的DI听起来很奇特。考虑使属性公开,甚至更好,使用构造函数注入而不是属性注入。

这将使AutoFixture自动像Auto-Mocking Container一样工作。

但是,AutoFixture是一个非常可扩展的库,所以如果你真的必须这样做,应该可以写一个可以写入私有属性的扩展,但它不会是最简单的AutoFixture扩展有史以来。

相关问题