当从Visual Studio/Microsoft测试框架运行时,Log4net找不到配置文件。

7
我们正在编写单元测试,针对在.NET 4.0下运行的业务层。该业务层是一个简单的C#类库,通常在SOAP和REST web服务中运行。我们的应用程序使用log4net进行日志记录,而log4net位于一个单独的包装程序集中。日志程序集中的C#代码具有程序集信息指示符,告诉log4net配置文件的名称,例如-

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

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

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

如果您对在Microsoft测试框架中运行log4net有任何提示,将不胜感激。

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属性。

这正是我们所需的,这将使整个团队非常开心。非常感谢。我想为这个答案投票,但我没有足够的SO活动去做 - 但未来的读者应该把它看作是对这个答案的额外支持。 - Biff Gaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接