2014-03-28 105 views
9

我可以指示AutoFixture还填写私人财产,其中注明了所有类的特定属性,例如Ninject.Inject?源似乎只扫描公共属性:1。这个问题提供了一个专用MyClass与私人setter,但不是私人财产或所有类的解决方案:2AutoFixture和私人财产

我使用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

NB Ninject 2或更高版本不支持注入'私人'(它不应该包含在'马克的答案中)。真的不这样做 –

+0

我使用的版本是3.0.1.10,只要你指示Ninject注入它们('InjectNonPublic'),注入'private's就可以正常工作。我同意马克的回答! – Jani

+0

该死的曾经以为这个选项也在V2 reimpl中死了,但我立场纠正。这意味着这些文档是错误的(它说,在我上次查看并在两年前使事情保持一致时,许多地方的V2注入了私有化)。可悲的是,我无法激励自己在wiki中解决这些问题 - 希望其他人能够解决这些问题。 –

回答

9

AutoFixture不具有内置支持非公共字段或属性分配值。这是设计。

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

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

由于您正在引用NInject,因此看起来好像您正在使用依赖注入(DI)。但是,具有私人物业注入的DI听起来异乎寻常。考虑使属性公开或更好地使用构造器注入而不是属性注入。

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

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

+0

感谢您的鼓舞人心的评论!我确实使用DI和AutoFixture和Moq作为自动嘲讽容器。我为我的类使用属性注入,因为构造函数注入看起来像我的样板。我还使用私有属性来防止来自外部的修改,以防止任何可能的错误。只要(DI +测试)工具能够设置私有字段,就可以正常工作:)我想,我应该学会使用样板文件,并且更喜欢构造器注入来正确地执行内容,因为无论如何都应该管理依赖关系。非常感谢AutoFixture! – Jani

+0

我不确定我是否明白为什么构造函数比属性的样板更多...无论如何,如果您有依赖关系,您应该[更喜欢构造函数注入](http://blog.ploeh.dk/2011/05/30/DesignSmellDefaultConstructor)。有关更多详细信息,请阅读[我的书](http://affiliate.manning.com/idevaffiliate.php?id=1150_236):) –

+0

注释字段比在构造函数中接收字段更容易,然后将其分配给一个领域。当然,添加过多的字段注入相关性非常容易,但IDE会警告您。另外,说实话,我已经长大了与田间注射,这似乎是我的一个坏习惯。获得的教训,更喜欢构造函数注入。谢谢你教育我!哦,我一定要阅读一些.NET书籍,因为这是我的第一个.NET项目! – Jani