我在WebAPI2 Web服务上使用XUnit作为我的测试用例。 我有一个使用
获取App_Data
目录的电话
AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
当应用程序发布并正常运行时返回正确的路径,但是当我运行测试时,它不会返回App_Data
目录的路径。
我得到了这个例外:Object reference not set to an instance of an object.
我有什么想法可以做到这一点?我试图在我的测试项目中添加一个App_Data
目录,但它导致了同样的异常。
基本上,这是我为需要访问的加密实用程序存储XML配置文件的地方。我应该把它移到根部吗?如果我这样做,我将如何从我的测试单元访问它?
答案 0 :(得分:2)
为此,我建议你抽象掉配置数据检索。
如果您需要更多方法,请使用一种或多种方法编写接口,例如:
public interface IConfigurationData
{
string RetrieveConfigurationData()
}
它的实现将转到磁盘上的App_Data文件夹。 在单元测试中,您可以模拟该接口,并使其检索测试所需的任何配置。
单元测试不应该触及任何外部系统,如文件或数据库或第三方API。你将它们抽象出来并使用像RhinoMocks,Moq或NSubstitute这样的东西来嘲笑它们。无论你喜欢什么。
原因是您希望您的单元测试尽快运行。在您引入实际系统(如文件)的那一刻,它们不再那么快,并且当您添加更多单元测试时,执行时间会不断增加。理想情况下,您希望您的单元测试在几秒钟内运行,因此您可以根据需要多次运行它们,而不会延迟开发过程。
答案 1 :(得分:-1)
如果您将配置复制到测试项目(作为app.config
),然后使用System.Configuration.ConfigurationManager.AppSettings["SettingName"]
,那么当使用测试项目和{{1}运行时,它将从app.config中拉出来使用MVC项目运行时。