在同一解决方案中创建一个独立项目来进行NUnit测试

5

我有一个解决方案,包含我的主要项目和使用NUnit的测试项目。一切都编译成功了,但是当我运行NUnit时,在测试加载后,我得到了下面的异常,导致测试失败。我已经将主项目添加为引用,并且在外部工具设置中,对于NUnit参数,我有$(ProjectDir)bin/Debug/$(TargetName)$(TargetExt),并且初始目录为空。

MyMainProjectTests.Database.TestAddDelete:   
System.BadImageFormatException : Could not load file or assembly 'MyMainProject, 
    Version=1.1.1.0, Culture=neutral, PublicKeyToken=null' or one of its 
    dependencies. An attempt was made to load a program with an incorrect format.
TearDown : System.Reflection.TargetInvocationException : Exception has been 
    thrown by the target of an invocation.
  ----> System.BadImageFormatException : Could not load file or assembly 
    'ChickenPing, Version=1.1.1.0, Culture=neutral, PublicKeyToken=null' or one 
    of its dependencies. An attempt was made to load a program with an incorrect 
    format.

在搜寻了数小时后,我唯一发现的是VS2005中提到了/bin和/obj目录的一个bug,但所提供的答案并没有帮助。

有什么解决方案吗?


你能给一些测试代码(TestAddDelete)的例子吗? - curtisk
6个回答

15

我将单元测试项目设置为启动项目而不是将 NUnit 设置为外部工具。在项目的属性窗口中,将“启动操作”设置为“启动外部程序”,并指向 nunit.exe。在“启动选项”部分,我在“命令行参数”框中指定测试程序集(不需要路径)。这时,只需按下 F5 即可启动 NUnit。


1
给这个人一个赞!这真的很好,因为你可以在运行 NUnit GUI 时逐步执行单元测试。 - sourcenouveau

11
请使用nunit-x86.exe而不是nunit.exe作为您的运行程序。更好的长期解决方案可能是购买ReSharper,它包括一个更好的NUnit测试运行程序,可以完全集成到Visual Studio中。它可以自动检测您的.NET项目类型(x68或x64)。ReShaper还带有许多其他功能,其中单元测试只是其中之一。他们的测试运行程序还与他们的DotCover代码覆盖分析器集成。您可能需要较新版本的Visual Studio才能使用ReSharper。最新版本可以与Visual Studio 2013社区版配合使用,您可以免费获得该版本,但我了解您可能会在升级某些旧的VS2005项目功能时遇到问题。我与ReSharper没有任何关联。

7

您是否在使用x64位系统?如果从x86位系统加载x64位文件或反之,则会出现该错误。此外,您尝试创建的路径应该是$(TargetPath)宏。


我是,没错。你所说的路径是什么意思?我对此还很陌生,你能否请发一下你是如何在外部工具中设置 NUnit 的呢? - Echilon

5
只需将“Tests”项目的“平台目标”设置为“x86”。

0

前往 NUnit 安装地址(例如:C:\Program Files (x86)\NUnit 2.6.3\bin),打开 nunit-86.exe。


0

你的主要项目是 .exe 还是 .dll?旧版本的 .NET 无法引用 .exe,所以这可能是问题所在。

无论哪种情况,如果主程序集没有出现在测试程序集可以访问的地方(例如在同一目录中),我都会预期出现问题。你可以检查一下,如果没有,请将其放置在可访问的位置,例如通过让 Visual Studio 将被引用的(主)程序集复制到本地目录中。

"尝试加载格式不正确的程序" 让我想知道 "缺少程序集" 的理论是否正确,但是没有更多信息,这是我能想到的最好的猜测。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接