在C#中测试/注入私有字段有哪些好的做法?如果这是重复的,我深表歉意。我被赋予了向该方法添加一些覆盖的任务,并被告知模拟私有List属性。我的问题是:有没有办法测试私有字段?我找到的解决方案是添加新的构造函数来注入这个私有列表。我不确定这是否正确,因此我们将不胜感激任何帮助。publicclassClass1{publicClass1(Listlist)//这只是为了单元测试{list1=list;}私人只读InjectRepository_repository;//publicClass1(InjectRepositoryrepository)//这是实际的构造函数{_repository=repository;}私有列表list1=newList();publicvoidDo_Complex_Logic(){//list1将设置其中的项目//现在list1被传递给其他一些实例}}一个类的私有逻辑应该在其行为的公共表达中可见。换句话说,从理论上讲,根本不需要测试私有字段。没有办法直接测试私有字段;毕竟他们是私人的。如果您真的认为需要测试私有字段,那么我建议将其设为内部并通过[InternalsVisibleTo]属性将其公开给您的单元测试程序集。话虽如此,有些框架允许这样的事情,比如TypeMock。不要测试私有字段或方法。测试合约的行为-公共或内部方法。也就是说,您可以尝试:选项A。使私有成员成为内部成员并为要测试的程序集设置InternalsVisibleTo属性。选项B。编写一个包装器类,将私有字段/方法包装到公共字段/方法中。这种方法的好处是您不需要将私有方法设为内部方法。缺点是对于每个私有方法,您都会有一个包装器公共方法。所以方法的数量可能会增加一倍。添加到womp和oleksii已经说过的内容-您想要/需要测试私有方法的事实是一个标志(气味?),表明您的设计可能不正确。这是TDD的积极副作用之一(也是我个人最喜欢的)。一个例子:我在这里不完全理解你的领域,但一个简单的改变可能是,而不是没有参数的Do_Complex_Logic,你可以让它接受并返回一个列表:publicListDo_Complex_Logic(Listinput)我知道-这很简单,但首先尝试解构你的类并用测试重建它。我不同意其他答案;但在这种情况下,我认为最合适的做法是——给定你的代码;是将签名更改为“Do_Complex_Logic”真正的问题是您正在处理List1的“状态”。如果将List1传递给Do_Complex_Logic-你的问题基本上就解决了。您的评论说“Do_Complex_Logic”将(可能)对List1做一些工作,然后将其传递给其他东西,对吗?使Do_Complex_Logic接受一个列表并返回一个列表。现在很容易测试。您可以“注入依赖项”,而不是依赖于在类中正确设置的List1的状态。私营部门如何准备?如果它是通过与存储库的交互,那么您可能正在模拟该对象。一种方法是通过接口与您的存储库交互(我们称它为IInjectRepository而不是具体实体,然后使用诸如Moq(或那里的许多模拟框架之一)之类的东西在设置测??试中使用模拟填充您的数据存储库。当调用Do_Complex_Logic时,我假设你有一个询问实体的方法,所以你知道它做了你期望它做的事情。这样你就可以避免/减轻添加方法和类来只测试。你可以在答案中做到这一点相关问题https://stackoverflow.com/a/3376157/1523402中使用了Reflection,不知道privatevisitor是否也适用于privatefields。但它们(至少)对私有方法有帮助(参见http://msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx)。以上是C#学习教程:Whatisagoodpracticefortesting/injectingprivatefieldsinC#?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
