确定程序集目录时NUnit出现问题

Cyl*_*ric 29 .net nunit

我刚刚开始使用NUnit来为我的项目提供一些测试覆盖.

在我的主library.dll中,我需要从库,library.xml的外部文件中加载配置数据.

这在我使用库时工作正常,因为我使用以下内容来获取查找配置文件的目录:

string settingspath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Run Code Online (Sandbox Code Playgroud)

我注意到的问题是,当我使用NUnit进行单元测试时,它会将我的程序集复制到Shadow Copy,但不会带任何其他文件,所以当然我的init由于缺少配置文件而失败.

我应该做些不同的事情来从我的库中找到配置文件吗?(这是一个服务器应用程序,我不想使用标准的应用程序设置,或用户的本地设置等)

Jef*_*wis 49

使用可以TestContext.CurrentContext.TestDirectory 像NUnit的Charlie Poole一样使用:

访问与测试程序集在同一目录中的文件的需要是禁用卷影副本的最常见原因.然而,这是虚假的.

NUnit不复制任何程序集:shadow copy是.NET本身的一个功能.因此,问题需要被视为"我如何访问文件所在的位置?" 而不是"如何将文件复制到我认为应该的位置?"

有三种方法可以找到与程序集位于同一目录中的文件:

1)使用Assembly.Codebase - 这将为您提供URI的位置,然后您必须将其转换为适当的路径.

2)使用当前目录,NUnit历史上将其设置为包含正在执行的测试程序集的目录.但是,对于将来的版本,这可能不是这样.

3)使用NUnit的TestContext.CurrentContext.TestDirectory,这是最新版本中提供的.

所有这些方法实际上都使用了Assembly.Codebase,NUnit在#2和#3中正确地转换了URI.使用Assembly.Location的常见方法是不正确的,除非您确实需要卷影副本缓存的位置.

  • 如果你想使用当前目录枚举测试用例,这不起作用,因为`TestCaseSource`现在必须引用`static`属性/字段/方法.在评估它的时候,没有设置`TestContext.CurrentContext`. (5认同)
  • ^^^^^这是正确的答案^^^^^.Nunit已经完成了将Assembly.Codebase转换为路径的工作 (2认同)

Gis*_*shu 19

为了在我的单元测试中使用参考文件,我使用Assembly.Codebase,即使启用了Shadow Copying也可以使用它.你可能想尝试一下..

它返回Uri格式的字符串..所以你需要从codebase字符串创建一个Uri实例并使用Uri.LocalPath来获取实际的文件夹路径.

但是对于生产代码,应从众所周知的位置检索BaseFolder(例如,通过Windows上的安装程序设置的注册表项).所有文件查找都应该来自此baseFolder.


Tim*_*son 13

即使影子复制处于活动状态,也AppDomain.CurrentDomain.BaseDirectory指向测试DLL的原始位置.

但是,如果您可以将测试数据作为资源嵌入DLL中,那么它会更加安全,因为没有额外的文件可以丢失.


Jac*_*ope -13

在进行单元测试时,通常建议通过模拟/存根调用它们的例程来避免外部依赖项(例如文件系统和数据库)——这样您的测试更加本地化、不那么脆弱且更快。看看是否可以通过提供虚假的配置信息来删除依赖项。

  • 作为评论,我对此评论+1,但作为答案,它对我没有帮助(我正在使用 NUnit 运行一些集成测试,无论好坏,这个答案*不会*帮助我做到这一点工作)。 (3认同)