c# - 在单元测试中使用xml转换

原文 标签 c# visual-studio-2010 unit-testing slowcheetah xslt

背景:

当前,我们有大约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)

问题:

我的想法是为团队中的每个开发人员在SlowCheetah dll中的配置文件上使用TestBase xml转换,但是转换后的文件不会复制到单元测试的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);要么
更改您的项目,以便它们都共享相同的Output目录。这将确保DeploymentItem属性将已转换的TestBase配置文件复制到TestRun文件夹。 (顺便说一句,共享输出文件夹是加快构建速度的好方法,因为不需要反复复制依赖项和内容)


(此外,疯狂的道具发给@SayedIbrahimHashimi,后者是SlowCheetahXml的主要贡献者之一-忠实的粉丝,请多加研究这个扩展名)

相关文章:

c# - 如何从C#中的特定光标点开始读取文件?

c# - 检查内部异常的最佳方法?

c++ - 在MSVC2010 Express和Qt 4.8(Qt Creator 2.4.1)中调试资源文件编译(rc.exe)

c# - / MD和/ MT运行时库之间的编码

c++ - 断言<dst.data!= src.data>在未知函数../../ocv/opencv/modules/imgproc/src/imgwarp.cpp中失败

c++ - 单元测试应用程序与硬件的接口(interface)-是否模拟

c# - 运行Windows服务时出现FileNotFoundException

c# - 在主线程上继续执行任务

unit-testing - 是否可以将服务定位器用于普遍使用的依赖关系?

angular - 找不到转换选项中的模块<rootDir> /node_modules/jest-preset-angular/preprocessor.js