我想知道如何正确使用NUnit.首先,我创建了一个单独的Test-Project,它使用我的主项目作为参考.但在那种情况下,我无法测试私有方法.我的猜测是我需要将我的测试代码包含在我的主代码中?! - 这似乎不是正确的方法.(我不喜欢在其中加载代码的代码.)
如何使用NUnit测试私有方法?
通常,单元测试解决了类的公共接口,理论上实现是无关紧要的,只要从客户的角度来看结果是正确的.
因此,NUnit不提供任何测试非公开成员的机制.
虽然我同意单元测试的重点应该是公共界面,但如果您也测试私有方法,则会对代码产生更为细致的印象.MS测试框架允许通过使用PrivateObject和PrivateType,NUnit不允许.我做的是:
private MethodInfo GetMethod(string methodName) { if (string.IsNullOrWhiteSpace(methodName)) Assert.Fail("methodName cannot be null or whitespace"); var method = this.objectUnderTest.GetType() .GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance); if (method == null) Assert.Fail(string.Format("{0} method not found", methodName)); return method; }
这种方式意味着您不必牺牲封装来支持可测试性.请记住,如果要测试私有静态方法,则需要修改BindingFlags.以上示例仅用于方法.
编写单元测试的常见模式是仅测试公共方法.
如果您发现有许多要测试的私有方法,通常这表示您应该重构代码.
在目前居住的班级上公开这些方法是错误的.那会打破你希望那个班级拥有的合同.
将它们移动到辅助类并在那里公开它可能是正确的.您的API可能不会公开此类.
这样,测试代码永远不会与您的公共代码混合在一起.
类似的问题是测试私有类,即.您不从程序集导出的类.在这种情况下,您可以使用属性InternalsVisibleTo显式地使测试代码程序集成为生产代码程序集的朋友.
可以通过将测试程序集声明为正在测试的目标程序集的友元程序集来测试私有方法.请参阅以下链接了解详情:
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
这可能很有用,因为它主要是从您的生产代码中分离您的测试代码.我自己从未使用过这种方法,因为我从未发现需要它.我想您可以使用它来尝试测试极端测试用例,这些测试用例在测试环境中无法复制,以查看代码如何处理它.
如前所述,你真的不需要测试私有方法.你不仅仅想要将代码重构为更小的构建块.当您进行重构时,可能会帮助您的一个提示是尝试思考您的系统所涉及的域,并考虑居住在该域中的"真实"对象.系统中的对象/类应直接与真实对象相关,这将允许您隔离对象应包含的确切行为,并限制对象的职责.这意味着您在逻辑上进行重构,而不仅仅是为了测试特定方法; 您将能够测试对象的行为.
如果您仍然觉得需要测试内部,那么您可能还需要考虑在测试中进行模拟,因为您可能希望专注于一段代码.模拟是将对象依赖项注入其中的地方,但注入的对象不是"真实"或生产对象.它们是具有硬编码行为的虚拟对象,可以更容易地隔离行为错误.Rhino.Mocks是一个流行的免费模拟框架,它将基本上为您编写对象.TypeMock.NET(具有社区版的商业产品)是一个更强大的框架,可以模拟CLR对象.在测试数据库应用程序时,例如模拟SqlConnection/SqlCommand和Datatable类非常有用.
希望这个答案能为您提供更多信息,以便为您提供有关单元测试的一般信息,并帮助您从单元测试中获得更好的结果.
我赞成有能力测试私有方法.当xUnit启动时,它用于在编写代码后测试功能.测试界面就足够了.
单元测试已发展为测试驱动开发.具有测试所有方法的能力对于该应用程序是有用的.