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)

问题:

我的想法是对团队中每个开发人员的 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 文件夹中的文件。 (我倾向于认为是前者)

解决这个问题的一些建议:

  1. 将配置文件移动到 UnitTest 库并在那里应用转换,这将确保配置可以按预期随时供测试运行器使用;或者

  2. 在 TestSettings 文件(而不是 DeploymentItemAttribute)中配置部署选项,以从 TestBase 文件夹复制生成的文件。 (<解决方案目录>\TestBase\bin\Debug\cfg.xml);或者

  3. 更改您的项目,使它们共享同一个输出目录。这将确保 DeploymentItem 属性将转换后的 TestBase 配置文件复制到 TestRun 文件夹。 (顺便说一句,共享输出文件夹是加快构建速度的好方法,因为不需要一次又一次地复制依赖项和内容)

(另外,疯狂支持@SayedIbrahimHashimi,他是 SlowCheetahXml 背后的主要贡献者之一——忠实粉丝,请多多挖掘这个扩展)

关于c# - 在单元测试中使用 xml 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866620/

相关文章:

java - 域对象和简单的 JavaBeans 应该进行单元测试吗?

c# - 无法存档我的 IOS Xamarin 项目的发布版本

c# - 使用 Type 变量声明变量

c# - EF5 代码优先 - 具有额外字段的多对多

c# - 将 Web API 用于 Windows 服务以通过轮询接收命令和执行任务?

java - 对于 Java 测试,我应该模拟客户端还是模拟服务器

c++ - OpenMP 计算每个线程在循环中的迭代次数

c# - 为什么单元测试中未处理的异常不会导致使用 M​​STest 失败?

c++ - 对抗内存泄漏

c++ - Visual Studio 2010 单元测试