当我使用Visual Studio运行单元测试时,它工作正常,因为它从所有程序集所在的项目目录运行。 但是当我使用resharper 运行它时,它会出错
var services = Assembly.Load("SomeAssembly");
有错误
无法加载文件或程序集“SomeAssembly”或其中一个 依赖。系统找不到指定的文件..
所以我试过
var path = Assembly.GetExecutingAssembly().Location;
并不是第一个项目。这是
C:\用户\ *用户名* \应用程序数据\本地\ TEMP \ TestResults \ ... \缺货\
并且没有'SomeAssembly'。如何正确配置resharper或收集Visual Studio所有的程序集?
它发生在单元测试中,但不适用于NUnit,任何想法?
答案 0 :(得分:44)
Resharper shadow会复制程序集以进行默认测试。如果关闭卷影复制,它将在bin文件夹中运行,测试应该通过。 Here是关于关闭它的一些说明。
答案 1 :(得分:26)
在documentation for NUnit的Gui Test Runner设置中有关于卷影复制的以下注释
注意:如果您想要禁用卷影副本以访问与程序集相同的目录中的文件,您应该知道有其他选择。请考虑使用Assembly.Codebase属性而不是Assembly.Location。
以下是使用Assembly.Codebase属性
的示例 private string AssemblyLocation()
{
var assembly = Assembly.GetExecutingAssembly();
var codebase = new Uri(assembly.CodeBase);
var path = codebase.LocalPath;
return path;
}
答案 2 :(得分:12)
我遇到了同样的问题,resharper测试运行器在C:\中,而实际构建的dll和解决方案在另一个驱动器上。解决方案是解开"使用Legacy Runner"在resharper选项的MSTest设置页面中。
答案 3 :(得分:4)
尝试创建testsettings文件,并配置deployment rules for your tests。
旧版本的resharper似乎有some bugs when processing deployment of folders,我认为它是fixed in latest version of resharper 7。
答案 4 :(得分:3)
尝试使用此代码加载(见下文)。它将独立于测试运行器查找程序集。
private static string[] assemblyLookupPath = new[]
{
AppDomain.CurrentDomain.BaseDirectory,
Environment.CurrentDirectory,
Assembly.GetExecutingAssembly().Location
}.Distinct().ToArray();
public static void Assembly Load(string fileName)
{
var filePath = assemblyLookupPath
.Select(f=>Path.Combine(f, fileName))
.Where(File.Exists)
.FirstOrDefault();
/*do here null checks and raise errors, write logs, etc*/
return Assembly.LoadFrom(filePath )
}
答案 5 :(得分:2)
您正在使用Assembly.Load()
动态加载程序集。可能是您缺少对要加载的程序集的引用。否则,阴影复制可能会错过未引用的程序集。
如果您不想引用这些程序集,请确保将它们包含在项目中并将它们复制到输出目录中。您可以通过设置“复制到输出目录”属性或创建自定义的构建后步骤来实现此目的。
答案 6 :(得分:1)
只需完成mcdon
的非常有用的回答,使用assembly.Location
根据MSFT的说明给出正确答案:
CodeBase 是找到文件的地方的网址,而 位置是实际加载的路径。例如, 如果程序集是从互联网上下载的,它的CodeBase可能会 以“http://”开头,但其位置可能以“C:\”开头。如果 文件被复制了阴影,Location将是复制的路径 阴影副本目录中的文件。
知道CodeBase不能保证设置也很好 适用于GAC的程序集。将始终为装配设置位置 但是从磁盘加载。
因此我会使用以下内容:
public static DirectoryInfo GetAssemblyDirectory()
{
var assembly = Assembly.GetExecutingAssembly();
return new DirectoryInfo(Path.GetDirectoryName(assembly.Location));
}
答案 7 :(得分:1)
只需更改当前目录
即可var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;
// or
Directory.SetCurrentDirectory(dir);
答案 8 :(得分:0)
为我解决的是设置"复制本地"在测试项目中的nunit.framework.dll引用上将属性设置为true。
答案 9 :(得分:0)
如果在禁用“阴影构建”后运行并构建问题 您必须首先从Build选项中选择“Clean all”,然后在“shadow build”上构建项目禁用