您通常如何分离代码库和相关的单元测试?我知道有人为单元测试创建了一个单独的项目,我个人觉得这个项目令人困惑且难以维护.另一方面,如果您将代码及其测试混合在一个项目中,您最终会得到与您的单元测试框架(无论是NUnit,MbUnit还是其他任何内容)相关的二进制文件以及您自己的二进制文件.
这对于调试很好,但是一旦我构建了发布版本,我真的不希望我的代码再次引用单元测试框架.
我找到的一个解决方案是将所有单元测试都包含在#if DEBUG - #endif指令中:当没有代码引用单元测试程序集时,编译器足够聪明,可以省略编译代码中的引用.
有没有其他(可能更舒适)的选择来实现类似的目标?
我绝对主张将你的测试分成一个单独的项目.这是我认为的唯一方法.
是的,正如加里所说,它也迫使你通过公共方法测试行为,而不是玩你班级的内脏
正如其他人所指出的那样,一个单独的测试项目(对于每个正常项目)是一个很好的方法.我通常镜像命名空间并为每个普通类创建一个测试类,并在名称后附加'test'.如果您拥有可以在另一个项目中自动生成测试类和方法的Visual Studio Team System,则可直接在IDE中支持此功能.
如果要使用"内部"访问器测试类和方法,需要记住的一件事是将以下行添加到要测试的每个项目的AssemblyInfo.cs文件中:
[assembly: InternalsVisibleTo("UnitTestProjectName")]
v2之后的.Net框架具有一个有用的功能,您可以使用InternalsVisibleTo属性标记程序集,该属性允许程序集被另一个访问.
一种装配隧道功能.
在文件中使用编译器指令或创建单独项目的另一种替代方法仅仅是在项目中创建其他.cs文件.
通过项目文件本身的一些魔力,您可以指示:
nunit.framework DLL仅在调试版本中引用,并且
您的测试文件仅包含在调试版本中
示例.csproj摘录:
... ... False ..\..\debug\nunit.framework.dll ...