Resharper - NUnit - 无法运行单元测试,因为代码和测试项目二进制文件位于不同位置

时间:2015-09-01 14:19:47

标签: c# unit-testing nunit resharper

我的解决方案中有2个项目,一个是实际代码( NUnitSample1 ),另一个是带有单元测试的测试项目( NUnitSample1.Test )。 NUnitSample1.Test 包含第一个项目 NUnitSample1 的引用。两个项目的“构建输出”路径不同,并且已明确指定。 NUnitSample1 项目参考的CopyLocal属性需要设置为false

现在,当我构建并尝试使用ReSharper运行单元测试时,它失败并显示以下消息:

  

System.IO.FileNotFoundException:无法加载文件或程序集“NUnitSample1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”或其依赖项之一。系统找不到指定的文件。

我想这是因为二进制文件位于不同的文件夹中。有没有办法在保持这种结构的同时使用ReSharper运行测试?此外,已经有成千上万的测试编写,因此我需要一个涉及最少代码更改的解决方案。动态加载程序集(如AlexeiLevenkov所建议的)有效,但是它会涉及单独设置每个方法,这是不可行的。

+NUnitSample1Solution
 +NUnitSample1      //This folder contains the actual class library project
 +NUnitSample1.Test //This folder contains the test project
 +Binaries          //This folder contains the binaries of both projects
  +bin              //This folder contains the project dll
  +tests
   +bin             //This folder contains the test project dll

我发现这个NUnit link可以指定多个程序集,但是,当我尝试使用ReSharper运行时,这甚至不起作用。我也不确定我是否正确操作,需要在哪里添加配置文件?在实际项目或测试项目中?什么是构建动作应该是什么?

任何指针都将不胜感激。 TIA。

1 个答案:

答案 0 :(得分:0)

我可以使用TestFixtureSetup中的here的答案加载缺少的程序集(也可以使用Setup方法)。

[TestFixtureSetUp]
public void Setup()
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.AssemblyResolve += new ResolveEventHandler(LoadFromSameFolder);
}

static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
{
    string folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string assemblyPath = Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll");           
    if (File.Exists(assemblyPath) == false) return null;
    Assembly assembly = Assembly.LoadFrom(assemblyPath);
    return assembly;
}

可以修改LoadFromSameFolder方法中的上述代码以准确定位程序集。

PS:感谢Alexei Levenkov让我走上了正确的道路。