如何告诉nunit-console在Mono下使用4.0版本?

4

我在MonoDevelop下建立了一个简单的项目,并可以从那里成功地运行测试(*)。

当我尝试从命令行使用nunit-console.exe时,我会得到以下结果:

 .../mono2/bin/Debug$ nunit-console mono2.exe
 NUnit version 2.5.10.0
 ...
 Runtime Environment - 
   OS Version: Unix 2.6.32.44
  CLR Version: 2.0.50727.1433 ( 2.10.8.1 (Debian 2.10.8.1-1~dhx1~lucid1) )

 ProcessModel: Default    DomainUsage: Single
 Execution Runtime: Default
 Unhandled Exception:
 System.ArgumentException: NUnit components for version 4.0.30319 of the CLR are not installed
 ...

如果我省略了重要的内容,请告诉我。
nunit-gui给出了相同的错误。nunit-gui有一个选项可以从2.0切换到4.0,但是当我尝试时,它再次给出相同的错误,因此不允许我更改它。
更多细节:Ubuntu 10.04,使用http://badgerports.org/lucid.html存储库,因此是Mono 2.10.8.1。
根据MonoDevelop中的项目选项,该项目设置为使用"Mono/.NET 4.0"。
更多信息:
/usr/bin/nunit-console包含此内容:
#!/bin/sh

exec /usr/bin/cli /usr/lib/nunit/nunit-console.exe "$@"

而 /usr/lib/nunit/ 目录包含:

   3073 2011-03-14 18:13 nunit.exe.config
   2598 2011-03-14 18:13 nunit-console.exe.config
  23040 2012-02-29 10:19 nunit-console-runner.dll
   4608 2012-02-29 10:19 nunit-console.exe*
  76288 2012-02-29 10:19 nunit.uiexception.dll
 259072 2012-02-29 10:19 nunit.uikit.dll
 183808 2012-02-29 10:19 nunit-gui-runner.dll
   4096 2012-02-29 10:19 nunit.exe*

而nunit-console.exe.config包含:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <runtime>
    <!-- We need this so test exceptions don't crash NUnit -->
    <legacyUnhandledExceptionPolicy enabled="1" />

    <!-- Look for addins in the addins directory for now -->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="lib;addins"/>
   </assemblyBinding>

   <!--
    The following <assemblyBinding> section allows running nunit under 
    .NET 1.0 by redirecting assemblies. The appliesTo attribute
    causes the section to be ignored except under .NET 1.0
    on a machine with only the .NET version 1.0 runtime installed.
    If application and its tests were built for .NET 1.1 you will
    also need to redirect system assemblies in the test config file,
    which controls loading of the tests.
   -->
   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
            appliesTo="v1.0.3705">

      <dependentAssembly> 
        <assemblyIdentity name="System" 
                          publicKeyToken="b77a5c561934e089" 
                          culture="neutral"/>
        <bindingRedirect  oldVersion="1.0.5000.0" 
                          newVersion="1.0.3300.0"/>
      </dependentAssembly>

      <dependentAssembly> 
        <assemblyIdentity name="System.Data" 
                          publicKeyToken="b77a5c561934e089" 
                          culture="neutral"/>
        <bindingRedirect  oldVersion="1.0.5000.0" 
                          newVersion="1.0.3300.0"/>
      </dependentAssembly>

      <dependentAssembly> 
        <assemblyIdentity name="System.Drawing" 
                          publicKeyToken="b03f5f7f11d50a3a" 
                          culture="neutral"/>
        <bindingRedirect  oldVersion="1.0.5000.0" 
                          newVersion="1.0.3300.0"/>
      </dependentAssembly>

      <dependentAssembly> 
        <assemblyIdentity name="System.Windows.Forms" 
                          publicKeyToken="b77a5c561934e089" 
                          culture="neutral"/>
        <bindingRedirect  oldVersion="1.0.5000.0" 
                          newVersion="1.0.3300.0"/>
      </dependentAssembly>

      <dependentAssembly> 
        <assemblyIdentity name="System.Xml" 
                          publicKeyToken="b77a5c561934e089" 
                          culture="neutral"/>
        <bindingRedirect  oldVersion="1.0.5000.0" 
                          newVersion="1.0.3300.0"/>
      </dependentAssembly>

    </assemblyBinding>

  </runtime>

</configuration>

*: 嗯,当我尝试使用更奇特的Nunit属性时,我遇到了问题;这是我试图解决的真正的问题,它导致了我上面描述的那个问题。然而,上面使用的exe只有两个简单的测试,在MonoDevelop中运行良好。
2个回答

5

技巧在于修改nunit-console,(在Ubuntu 10.04上使用badgerports,看起来像/usr/bin/cli /usr/lib/nunit/nunit-console.exe),告诉/usr/bin/cli使用.NET 4!

因此,当我执行这个命令时:

/usr/bin/cli --runtime=v4.0 /usr/lib/nunit/nunit-console.exe mytest.exe

我收到了这个输出:
NUnit version 2.5.10.0
...
Runtime Environment - 
   OS Version: Unix 2.6.32.44
  CLR Version: 4.0.30319.1 ( 2.10.8.1 (Debian 2.10.8.1-1~dhx1~lucid1) )

ProcessModel: Default    DomainUsage: Single
Execution Runtime: Default
..
Tests run: 2, Errors: 0, Failures: 0, Inconclusive: 0, Time: 0.040103 seconds
  Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0

如果您只使用NET 4,您可以编辑/usr/bin/nunit-console以始终设置这一点。(真正的问题是/usr/bin/cli自动检测选择了NET 2而不是NET 4;但经过多次搜索,我发现没有办法控制该自动检测过程。) ASIDE:我强调/usr/bin/cli的原因是,仅仅告诉nunit-console要使用哪个框架会失败(见下文)。也就是说,必须向/usr/bin/cli提供运行时版本,而不是nunit-console!
/usr/bin/cli /usr/lib/nunit/nunit-console.exe -framework=v4.0 mytest.exe
NUnit version 2.5.10.0
...
Runtime Environment - 
   OS Version: Unix 2.6.32.44
  CLR Version: 2.0.50727.1433 ( 2.10.8.1 (Debian 2.10.8.1-1~dhx1~lucid1) )

ProcessModel: Default    DomainUsage: Single
Execution Runtime: v4.0
Unhandled Exception:
System.ArgumentException: NUnit components for version 4.0 of the CLR are not installed
Parameter name: targetRuntime
  at NUnit.Util.TestAgency.LaunchAgentProcess (NUnit.Core.RuntimeFramework targetRuntime, Boolean enableDebug) [0x00000] in <filename unknown>:0 
...

4
请使用nunit-console4而不是nunit-console。

1
谢谢Rolf,但是没有那个名字的文件。(我刚刚更新了我的问题以展示现有情况。) - Darren Cook
看起来在Ubuntu上,nunit的打包方式有点不同。你有 /usr/lib/mono/4.0/nunit-console.exe 吗? - Rolf Bjarne Kvinge
不知道呢,这似乎是因为Ubuntu打包了NUnit的方式:| - Rolf Bjarne Kvinge

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