使用LoadControl(字符串VirtualPath)加载控件时,为什么会出现NullReferenceException?

时间:2009-06-05 08:01:55

标签: c# asp.net

我有一个测试项目,它是我尝试进行单元测试的解决方案的一部分。我要测试的方法之一是使用TemplateControl.LoadControl(string virtualPath)方法加载自定义控件,例如

LoadControl(“~/CustomControl/Action/FitlerBox.ascx”) 

我的问题是当我从Test项目调用此方法时,它总是返回NullReferenceException。这是因为我认为它永远找不到路径。

有关如何获取此路径的任何建议?

2 个答案:

答案 0 :(得分:1)

UPDATE - 我可以使用LoadControl()将其转换为ASP.NET单元测试来进行测试。这将在测试运行时启动Web服务器,这使得它们比普通的单元测试花费更长的时间。我在测试中添加了以下属性:

[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("%PathToWebRoot%\\WebSite", "/WebSite")]
[UrlToTest("http://localhost/WebSite/Default.aspx")]

我们在尝试使用〜(应用程序根目录)从单元测试中加载文件时遇到了类似的问题。在过去,我们通过将文件添加到TESTRUN.CONFIG文件(因此将它们复制到测试目录中)以及将代码更改为:

来解决此问题。
if (httpContext.Current == null)     // Running under unit test
    filename = "abc.txt";
else
    filename = "~/abc.txt";

但是,当我使用LoadControl调用(因此它现在是LoadControl(“x.ascx”)时,异常从NullReference更改为“此处不允许相对虚拟路径'x.ascx'”

答案 1 :(得分:0)

如果它位于您提到的路径中的网站下,它应该可以工作。如果没有,则尝试使用Server.MapPath来确定完整路径并使用它。