如何在MSTest单元测试项目中使用"外部"配置文件(即configSource)?
为简单起见,我通常将许多配置(即app.config和web.config的内容)拆分为单独的.config文件,然后使用'configSource'属性从主配置文件中引用它们。例如:
<appSettings configSource="appSettings.config"/>
然后将所有键/值对放入该appSettings.config文件中,而不是将其直接插入主配置文件中:
<appSettings> <add key="FirstKey" value="FirstValue"/> <add key="SecondKey" value="SecondValue"/> ... </appSettings>
这通常可以很好地与应用程序本身配合使用,但是在尝试编写单元测试时遇到了问题,无论出于何种原因,这些单元测试都需要从存储在这些外部文件之一中的配置节中获得一定的价值。 (我了解到,由于它们依赖于配置系统,因此大多数这些都将被视为"集成测试",我也有"纯单元测试",但这并不是问题所在。我真的很期待测试这些配置值是否正确检索,并以正确的方式影响行为)。
由于MSTest如何编译输出并将其复制到看起来与每次测试运行都不相同的混淆文件夹中(而不是像我们可能认为的那样复制到" bin"文件夹中),因此似乎在测试期间始终无法找到这些外部文件正在执行。我已经尝试过使用构建后动作来完成这项工作,但是没有运气。有没有一种方法可以在运行时将这些外部文件复制到正确的输出文件夹中?
解决方案
找到了:
如果我们编辑测试运行配置(通过双击添加新的单元测试时放入"解决方案"解决方案文件夹中的.testrunconfig文件),则会出现"测试运行配置"对话框。这里有一个名为"部署"的部分,我们可以在解决方案中的任何位置指定文件或者整个文件夹,这些文件或者整个文件夹可以在运行时与已编译的程序集一起复制到正确的文件夹中。
这样,我现在实际上可以只在一组外部.config文件中定义大多数配置,并在每次测试运行时将它们自动复制出来。
尝试在Visual Studio外部运行测试时,测试运行配置会有些尴尬。
对于使用MSTest的命令行执行,它们变得非常繁琐以保持"干净"。
它们对于解决方案也是"全局"的,因此将为每个测试项目复制外部文件。
我更喜欢DeploymentItem
属性。
[TestMethod] [DeploymentItem(@"test_data.file")] public void FooTest() {...}
使测试独立于.testrunconfig文件。