我们正在为在 .NET 4.0 下运行的业务层编写单元测试。业务层是一个简单的 C# 类库,通常在 SOAP 和 REST Web 服务中运行。我们的应用程序在单独的包装程序集中使用 log4net 进行日志记录。日志程序集中的 C# 代码有一个程序集信息指令,它告诉 log4net 配置文件的名称,一个 la-
[程序集:log4net.Config.XmlConfigurator(ConfigFile="AcmeLogging.config", Watch=true)]
通过包装器初始化 log4net 在 Web 服务中工作正常。当我们用我们的单元测试程序集初始化它时,它似乎看不到配置文件。 configuratino 文件通过properties 进行配置,复制到执行目录中,我们确实在bin\debug 目录中看到了它。使用从同一文件夹中运行的日志程序集的快速控制台测试程序工作正常。奇怪的是,行为问题是间歇性的,并且在不同时间出现在不同开发人员的机器上,并且无法以任何确定性的方式解决。
单步执行包装器程序集代码,log4netLogManager.GetLogger() 调用似乎正确返回,但 log.Logger.Repository.GetAppenders() 返回的附加程序列表为空。由于无论文件是否在 Bin\Debug 文件夹中,这种不正确的行为都是相同的,我们认为它没有看到该文件。
任何关于我们在 Microsoft 测试框架中运行 log4net 缺少什么的线索将不胜感激。
请您参考如下方法:
单元测试的独特之处在于,如果您在单元测试中需要配置文件,则需要将它们作为部署项包含在内。这是我如何在测试类中执行此操作的示例:
[TestClass]
[DeploymentItem("hibernate.cfg.xml")]
public class AsyncForwardingAppenderTest
{
}
除了
Deployment
您需要的属性
启用部署 在您的测试设置中。为此,请转到测试-> 编辑测试设置->。然后点击
Deployment
右侧区域。单击复选框
Enable Deployment
.
执行此操作并运行测试后,您的配置文件应位于测试结果文件夹中。 TestResults\username_machine 日期戳\Out .如果您的配置文件不在此文件夹中,它将无法工作。这就是 DeploymentItem 属性的作用。它将文件粘贴在此 出 文件夹。
如果您不想在每个测试类中都包含 DeploymentItem 属性,我所做的就是创建一个基本测试类,所有使用 log4net 的测试都从该类继承并使用 DeploymentItem 属性对其进行标记。