2009-09-21 40 views
0
var mockedService = new Mock<IService>(); 
mockedService.Setup(x => x.InterfaceMethod(args)).Returns(value); 
_Service = mockedService.Object; 
MyController controller =new MyController(_Service); 

var result = (ViewResult)controller.Foo(); 

現在這個富()方法包含下列API調用如何繞過HTTPContext的使用。

HttpContext.GetGlobalResourceObject(...,..); 

但HttpContext的是空,因爲我只是單元測試,我沒有驗證。因此不會填充HTTPContext對象。

因爲HTTPContext是密封的,所以我不能設置這個類的期望值。

我一直在尋找中網,但只有樣品假冒HTTPContextBase

現在怎麼讓我的單元測試通過。有什麼建議麼。?

感謝,

維傑

+1

第二個代碼塊肯定有問題... – 2009-09-21 09:37:54

+1

我的意思是,首先製作一個新的控制器實例,下一行通過重新分配控制器變量將其扔掉。 – 2009-09-21 09:38:57

+0

在第二個代碼片段中,爲什麼要將控制器變量分配兩次?第一行似乎是多餘的。 – 2009-09-21 09:39:00

回答

1

問題是你不設置爲「中心」的方法的期望。當你嘲笑一個對象時,所有的實現都會被Noop替代,除非你使用Expectation指定。

我猜你嘲笑GetValueFromResource而不是Centres因爲Centres電話GetValueFromResource。如果是這種情況,嘲笑GetValueFromResource可能是一個多餘的假,你不需要它。另外,正如在Moq的其他幾篇帖子中指出的那樣,你需要確保你不是在嘲笑你正在測試的東西。如果你真的試圖測試MyController,你會想要嘲笑它的任何依賴,但不是MyController本身。這會導致你無法結束混亂。

編輯

在此基礎上的反饋,似乎你已經知道你真正的問題是,你需要模擬的HttpContext。嘲笑HTTPContext並不重要。有一些工具可以在本地執行,例如Type Mock,但問題是環境上下文不可測試。

應該正在做的是請求依賴關係,這些依賴關係爲您提供所需的信息,同時抽象出它們的實現。例如,在你的情況下,你似乎使用HTTPContext來訪問資源。如果你需要這樣的事情,你可以使用一個很好的接口將是:

public interface IResourceStore 
{ 
    object GetGlobalResource(string classKey, string resourceKey); 
} 

你的默認實現將使用的HttpContext,但現在您可以直接讓你可以模擬接口,讓您的myController的類的使用,而不是HttpContext的。

Mock<IResourceStore> resourceStore = new Mock<IResourceStore>(); 
//setup resourceStore expectations here 

MyController testingTarget = new MyController(_Service, resourceStore.Object); 
//target assertions here 

希望這會有所幫助。

+0

@Anderson GetValueFromResource()方法使用HTTPContext,所以當遇到該API調用時,會引發空引用異常。現在我該怎麼做。 ?有什麼建議麼。? – vijaysylvester 2009-09-21 14:32:21

+0

我通常創建一個幫助類,它爲我訪問HTTPContext,我從需要HTTPContext的類中使用它。這樣你可以避免從任何地方引用HTTPContext。另外,在互聯網上嘲笑HTTPContext也有不少教程。無論我希望你已經知道,嘲笑你正在測試的東西並不是一個好主意。 – 2009-09-21 14:35:10

+0

我們可以手動設置HTTPCOntext對象嗎? 像這樣HTTPcontext context = new HTTPCOntext(Req,Res)。 手動構建Req和Res對象之後。 – vijaysylvester 2009-09-22 03:45:32