单元测试开始后的FileNotFoundException。试图在AppData下搜索

时间:2014-08-06 06:21:25

标签: c# unit-testing

[SetUp]部分,其中加载了一些文件以供以后测试。

它应该加载:

private string GiveFilePath()
{
   string folder;
   string assemblyPath;

   assemblyPath = Assembly.GetExecutingAssembly().Location;
   folder = new FileInfo(assemblyPath ).DirectoryName;
   return folder + @"\" + FileNameAsConst;
}

但是我得到了

System.IO.FileNotFoundException

中的

C:\Users\username\AppData\Local\Temp\...

导致它尝试从AppData而不是从项目文件夹加载此文件。

已经问过类似的question。答案是,问题的作者发现自己要将ShadowCopyFiles属性设置为true

但代码或配置文件中没有任何ShadowCopyFiles

你有什么想法吗?

更新

[SetUp]
public void SetUp()
{       
    this.facade = new MyFacade();
}

[Test]
public void InstanceIsNotNull()
{
   Assert.IsNotNull(facade);
}

...

public MyFacade()
{
   FileStream fileStrem = new FileStream(GiveFilePath(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   ...
}

2 个答案:

答案 0 :(得分:1)

您应该了解正在运行测试的上下文以及您提供的代码的上下文,无论执行程序集是实际测试还是您要加载到单独(或相同)AppDomain中的外部程序集等。

大多数情况下,如果你没有做任何特别的事情,如果你要加载的文件与执行程序集位于同一个地方,你就不需要对Assembly.GetExecutingAssembly进行反射调用。您可以轻松使用System.IO命名空间中的类来管理此文件,该文件比任何反射操作都便宜。您甚至不需要指定整个绝对路径,相对路径就足够了。如果文件包含在项目中,请确保将“复制到输出目录”设置为“始终复制”,并确保将“构建操作”设置为“内容”,然后在运行时首先确保文件存在......

if(File.Exists("filename.ext"))

注意路径是相对的,然后对文件执行任何操作...

File.ReadAllText("filename.ext");
File.Delete("filename.ext");

答案 1 :(得分:1)

我强烈怀疑在进入unittest之前装配位置发生了一些事情,这就是为什么我建议你使用不同的unittest设置。

尝试遵循AAA模式:

安排:设置运行测试代码所需的一切。这包括测试运行所需的依赖项,模拟和数据的任何初始化 行动:调用测试中的代码 断言:指定测试的通过条件,如果不符合则会失败。

您的unittest肯定会澄清以下内容:

  • 测试中实际发生了什么
  • 正在使用哪些数据
  • 正在测试的内容

Taken from this link.

从您提供的代码中,不知道其他测试是否可能干扰了所使用的数据。不同的文化或其他改变很可能alter the setup of facade

我建议您将unittest更改为AAA模式并隔离问题。因此,将设置更改为unittest内部,以消除从其他位置进行的任何更改。

单独运行此单元测试,无需运行任何其他操作。我已经看到单位测试失败了,因为在运行我关注的单元测试之前,文化已在一个单元测试中被更改(并且由于这种文化变化而失败)。

如果在隔离单元测试后问题仍然存在;提供可重现的代码,为您提供此问题。