7

我们正在为在 .NET 4.0 下运行的业务层编写单元测试。业务层是一个简单的 C# 类库,通常在 SOAP 和 REST Web 服务中运行。我们的应用程序在单独的包装程序集中使用 log4net 进行日志记录。日志程序集中的 C# 代码有一个程序集信息指令,它告诉 log4net 配置文件的名称,一个 la-

[程序集:log4net.Config.XmlConfigurator(ConfigFile="AcmeLogging.config", Watch=true)]

通过包装器初始化 log4net 在 Web 服务中可以正常工作。当我们使用单元测试程序集对其进行初始化时,它似乎看不到配置文件。configuratino 文件通过属性配置为复制到执行目录,我们确实在 bin\debug 目录中看到它。使用在同一文件夹中运行的日志程序集的快速控制台测试程序可以正常工作。奇怪的是,行为问题是断断续续的,在不同的时间出现在不同开发人员的机器上,无法以任何确定性的方式解决。

单步执行包装程序集代码,log4netLogManager.GetLogger() 调用似乎正确返回,但 log.Logger.Repository.GetAppenders() 返回的附加程序列表为空。由于无论文件是否在 Bin\Debug 文件夹中,这种错误行为都是相同的,因此我们认为它没有看到该文件。

任何关于我们在 Microsoft 测试框架中运行 log4net 所缺少的线索将不胜感激。

4

1 回答 1

8

单元测试的独特之处在于,如果您在单元测试中需要配置文件,则需要将它们作为部署项包含在内。这是我如何在测试类中执行此操作的示例:

[TestClass]
[DeploymentItem("hibernate.cfg.xml")]
public class AsyncForwardingAppenderTest
{

}

除了Deployment您需要在测试设置中启用部署的属性。为此,请转到测试-> 编辑测试设置->。然后点击Deployment右边的区域。单击复选框Enable Deployment

完成此操作并运行测试后,您的配置文件应位于测试结果文件夹中。TestResults\username_machine date stamp\Out。如果您的配置文件不在此文件夹中,它将无法工作。这就是 DeploymentItem 属性的作用。它将文件粘贴在此Out文件夹中。

如果您不想在每个测试类中包含 DeploymentItem 属性,我所做的就是创建一个基本测试类,所有使用 log4net 的测试都从该类继承并用 DeploymentItem 属性标记它。

于 2013-01-11T06:29:44.103 回答