我的代码执行此操作
string domainUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
int result = string.Compare(domainUrl, "http://www.facebookmustdie.com");
// do something with the result...
我如何模拟这个以便我的单元测试通过,我是否必须模拟整个HttpContext类?如果是这样的话,我将如何将其注入代码中,以便在运行单元测试时使用“正确的”HttpContext
答案 0 :(得分:14)
var sb = new StringBuilder();
TextWriter w = new StringWriter(sb);
var context = new HttpContext(new HttpRequest("", "http://www.example.com", ""), new HttpResponse(w));
HttpContext.Current = context;
Console.WriteLine(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority));
答案 1 :(得分:2)
HttpContext单例不能轻易模拟,也不能很好地与单元测试一起使用,因为它将您与IIS基础结构联系在一起。
Moles也可以胜任这项工作,但真正的问题是与IIS的密切联系。
您应该将相关的请求数据(例如,在您的情况下为url)传递给您的函数或类,以便能够将您的逻辑与基础结构隔离开来。这样,您就可以将它与IIS分开,并轻松地在测试基础架构上运行它。
答案 2 :(得分:0)
基本上,有两种可能性:
HttpContext
。HttpContext
类或仅为UrlHelper引入一个接口,并将实现该接口的类的实例传递到您的类中。关键字:依赖注入(DI)答案 3 :(得分:0)
我不知道你正在为这个代码编写什么类型的项目,但如果它是一个MVC项目,我建议重新编写代码以使用HttpContextBase - 如果可能的话。然后你可以创建一个存根或模拟这个并为你的测试注入。 Request.Url返回System.Uri,所以你必须创建一个这样的实例并在你的上下文stub / mock上设置它。
答案 4 :(得分:0)
以上示例:
$rootScope.AlertsGlobal = {};
this.updateHeight = function (clientHeight) {
$rootScope.AlertsGlobal.clientHeight = clientHeight;
};