背景:
目前,我们有大约 10 个单元/集成测试项目会访问数据库进行测试。每个访问数据库的测试类都继承自名为 IntegrationTest
的类,该类位于名为 TestBase
的单独 dll 中。 TestBase
包含一个配置文件 (nhibernate_log4net.cfg.xml),其中包含数据库的连接字符串。
我们的开发团队大约有 7 或 8 人。如果两个团队成员同时运行单元测试,就会发生冲突,因为很多测试都在添加和删除许多测试中共有的数据.这会导致两个开发人员之间的测试错误地失败。
布局:
TestBase.dll
IntegrationTest.cs(包含[DeploymentItem("nhibernate_log4net.cfg.xml"])
nhibernate_log4net.cfg.xml
nhibernate_log4net.cfg.Developer 1.xml(改造文件)
nhibernate_log4net.cfg.Developer 2.xml(改造文件)
...
UnitTest.dll
引用 -> TestBase.dll
MyUnitTest.cs(继承自TestBase.dll中的IntegrationTest)
问题:
我的想法是对团队中每个开发人员的 TestBase
dll 中的配置文件使用 SlowCheetah
xml 转换,但转换后的文件不会复制到 <单元测试的strong>Out目录。基本配置文件(未转换的文件)是被复制到 Out 目录的文件。我有一种感觉,这是因为我必须首先使用 [DeploymentItem("nhibernate_log4net.cfg.xml")
属性来获取配置文件。
有什么方法可以对包含在与单元测试项目不同的 dll 中的 xml 配置文件使用 xml 转换?
最佳答案
您可以通过从 msbuild 调用目标来手动运行转换,如下所述:http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx
更新
我已经能够重现您的问题。这很微妙,但我认为它按预期工作。这是正在发生的事情:
- 正在应用配置转换。转换后的文件放在 TestBase 输出目录中。
- 您已经在测试中指定了 *[DeploymentItem("nhibernate_log4net.cfg.xml")]* 但这失败了,因为该文件与 UnitTest 项目无关。作为补偿,您使用 "Copy Local"=true 标记了您的配置文件
- “复制本地”确保将 TestBase 项目的内容复制到 UnitTest 项目,但它要么从源位置复制预转换文件,要么在 XmlTransform 任务运行之前移动 bin 文件夹中的文件。 (我倾向于认为是前者)
解决这个问题的一些建议:
将配置文件移动到 UnitTest 库并在那里应用转换,这将确保配置可以按预期随时供测试运行器使用;或者
在 TestSettings 文件(而不是 DeploymentItemAttribute)中配置部署选项,以从 TestBase 文件夹复制生成的文件。 (<解决方案目录>\TestBase\bin\Debug\cfg.xml);或者
更改您的项目,使它们共享同一个输出目录。这将确保 DeploymentItem 属性将转换后的 TestBase 配置文件复制到 TestRun 文件夹。 (顺便说一句,共享输出文件夹是加快构建速度的好方法,因为不需要一次又一次地复制依赖项和内容)
(另外,疯狂支持@SayedIbrahimHashimi,他是 SlowCheetahXml 背后的主要贡献者之一——忠实粉丝,请多多挖掘这个扩展)
关于c# - 在单元测试中使用 xml 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866620/