MrF*_*Fox 100 c# testing nunit unit-testing
我想知道如何正确使用NUnit.首先,我创建了一个单独的Test-Project,它使用我的主项目作为参考.但在那种情况下,我无法测试私有方法.我的猜测是我需要将我的测试代码包含在我的主代码中?! - 这似乎不是正确的方法.(我不喜欢在其中加载代码的代码.)
如何使用NUnit测试私有方法?
har*_*rpo 73
通常,单元测试解决了类的公共接口,理论上实现是无关紧要的,只要从客户的角度来看结果是正确的.
因此,NUnit不提供任何测试非公开成员的机制.
小智 52
虽然我同意单元测试的重点应该是公共界面,但如果您也测试私有方法,则会对代码产生更为细致的印象.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;
}
Run Code Online (Sandbox Code Playgroud)
这种方式意味着您不必牺牲封装来支持可测试性.请记住,如果要测试私有静态方法,则需要修改BindingFlags.以上示例仅用于方法.
mor*_*lli 46
编写单元测试的常见模式是仅测试公共方法.
如果您发现有许多要测试的私有方法,通常这表示您应该重构代码.
在目前居住的班级上公开这些方法是错误的.那会打破你希望那个班级拥有的合同.
将它们移动到辅助类并在那里公开它可能是正确的.您的API可能不会公开此类.
这样,测试代码永远不会与您的公共代码混合在一起.
类似的问题是测试私有类,即.您不从程序集导出的类.在这种情况下,您可以使用属性InternalsVisibleTo显式地使测试代码程序集成为生产代码程序集的朋友.
Daf*_*ins 20
可以通过将测试程序集声明为正在测试的目标程序集的友元程序集来测试私有方法.请参阅以下链接了解详情:
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
这可能很有用,因为它主要是从您的生产代码中分离您的测试代码.我自己从未使用过这种方法,因为我从未发现需要它.我想您可以使用它来尝试测试极端测试用例,这些测试用例在测试环境中无法复制,以查看代码如何处理它.
如前所述,你真的不需要测试私有方法.你不仅仅想要将代码重构为更小的构建块.当您进行重构时,可能会帮助您的一个提示是尝试思考您的系统所涉及的域,并考虑居住在该域中的"真实"对象.系统中的对象/类应直接与真实对象相关,这将允许您隔离对象应包含的确切行为,并限制对象的职责.这意味着您在逻辑上进行重构,而不仅仅是为了测试特定方法; 您将能够测试对象的行为.
如果您仍然觉得需要测试内部,那么您可能还需要考虑在测试中进行模拟,因为您可能希望专注于一段代码.模拟是将对象依赖项注入其中的地方,但注入的对象不是"真实"或生产对象.它们是具有硬编码行为的虚拟对象,可以更容易地隔离行为错误.Rhino.Mocks是一个流行的免费模拟框架,它将基本上为您编写对象.TypeMock.NET(具有社区版的商业产品)是一个更强大的框架,可以模拟CLR对象.在测试数据库应用程序时,例如模拟SqlConnection/SqlCommand和Datatable类非常有用.
希望这个答案能为您提供更多信息,以便为您提供有关单元测试的一般信息,并帮助您从单元测试中获得更好的结果.
这个问题已经进入高级阶段,但我想我会分享我的做法。
基本上,我在程序集中有我所有的单元测试类,它们在该程序集的“默认”下方的“UnitTest”命名空间中进行测试 - 每个测试文件都包装在:
#if DEBUG
...test code...
#endif
Run Code Online (Sandbox Code Playgroud)
块,所有这一切都意味着 a) 它不会在发布中分发,并且 b) 我可以使用internal/ Friendlevel 声明而无需跳箍。
这提供的另一件事与这个问题更相关,是使用partial类,它可用于创建用于测试私有方法的代理,例如测试诸如返回整数值的私有方法之类的东西:
public partial class TheClassBeingTested
{
private int TheMethodToBeTested() { return -1; }
}
Run Code Online (Sandbox Code Playgroud)
在程序集的主要类和测试类中:
#if DEBUG
using NUnit.Framework;
public partial class TheClassBeingTested
{
internal int NUnit_TheMethodToBeTested()
{
return TheMethodToBeTested();
}
}
[TestFixture]
public class ClassTests
{
[Test]
public void TestMethod()
{
var tc = new TheClassBeingTested();
Assert.That(tc.NUnit_TheMethodToBeTested(), Is.EqualTo(-1));
}
}
#endif
Run Code Online (Sandbox Code Playgroud)
显然,您需要确保在开发时不使用此方法,尽管如果您这样做,Release 构建很快就会指示对它的无意调用。
| 归档时间: |
|
| 查看次数: |
49713 次 |
| 最近记录: |