2011-11-04 37 views
2

可能重複:
How do I mock the HttpContext in ASP.NET MVC using Moq?假HTTP上下文

我的一個DLL的有這樣

public void RegisterPerson(Person p, HttpContext context) 
{ 
    //extract Ip 
    person.Ip=context.Request.UserHostAddress; 

    //Dome something Else 
} 

在我的測試方法我想創建一個假上下文並將其傳遞給方法,如下

[TestMethod] 
    public void InsertPerson() 
    { 
     Person p= new Person(); 
     _service.RegisterPerson(p, /*Fake context here*/); 
    } 

請教我如何做到這一點。

+0

看看這個:http://stackoverflow.com/questions/1452418/how-do-i-mock-the-httpcontext-in-asp-net-mvc-using-moq – Sam

回答

4

很難合理地模擬非*基本版本的HttpContext和相關類。考慮將代碼切換爲使用*基類,以便實際地嘲笑它們。您可以使用HttpContextWrapper(http://msdn.microsoft.com/en-us/library/system.web.httpcontextwrapper.aspx)輕鬆地將HttpContext轉換爲* Base版本,但是沒有內置的方法來完成反轉。

在您的特定情況下,請考慮傳入調用真正需要的信息(即context.request.UserHostAddress)而不是整個HttpContext對象。

3

如果一般方法詢問他們需要什麼,而不是尋找他們需要的東西,那麼通常方法更具可測性。

在你的例子中,這意味着傳入相關的HttpContext屬性(例如UserHostAddress)作爲參數(詢問你需要什麼,而不是查看HttpContext)。這可能會導致具有更多參數的方法,但它們將更加明確和可測試。

通過顯式註冊RegisterPerson參數,您不需要猜測將從HttpContext中提取哪些屬性(當您錯誤時獲取空引用) - 它們在方法的API中明確聲明。如果你做錯了什麼,編譯器會讓你知道。如果您稍後需要其他屬性,只需添加一個參數,編譯器會讓您知道需要更新的任何地方。

查看Google's guide to writing testable code瞭解更多信息。