我是否可以指示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();
}
}
答案 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扩展有史以来。