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