2014-03-06 33 views
0

我正在從TypeMock遷移到MS Fakes。在TypeMock我可以做的東西是這樣的:使用MS Fakes時,如何應用索引?

var fakeItem = Isolate.Fake.Instance<SPListItem>(); 

//some testing foo that uses the fake item Eg. 
MethodUnderTest(fakeItem); 

Assert.AreEqual(fakeItem["someField"], expected, "Field value was not set correctly"); 

在我斷言我可以檢索一個已經設置我的測試FOO中的字段值和比較,與我的期望。

當使用MS假貨,我會做這樣的事情:

var fakeItem = new ShimSPListItem() 
      { 
       //delegates in here 
      }; 

//some testing foo that uses the shim. Eg. 
MethodUnderTest(fakeItem); 

這一次,當我嘗試檢查我的價值已經被設置使用:

Assert.AreEqual(fakeItem["someField"], expected, "Field value was not set correctly"); 

我結束了一個編譯錯誤:

Cannot apply indexing with [] to an expression of type 'Microsoft.SharePoint.Fakes.ShimSPListItem' 

在SharePoint世界像這樣的索引是非常標準的做法和我的代碼聯合國德爾測試當然會這樣做,似乎沒有任何問題。我的問題是爲什麼我不能在我的測試中做到這一點?我已經嘗試將墊片投射到SPListItem,但它不被允許 - 我想我在這裏錯過了一些東西。有任何想法嗎?

回答

0

所以,我找到了答案:

var fakeItem = new ShimSPListItem() 
     { 
      //delegates in here 
     }; 
MethodUnderTest(fakeItem); 
var item=fakeListItem as SPListItem; 
Assert.AreEqual(item["someField"], expected, "Field value was not set correctly"); 

這不工作 - 我不能轉換fakeListItem使用「作爲」一個SPListItem。考慮這一點是有道理的,因爲墊片實際上不是從SPListItem派生的,而是由一堆代表組成,可以通過假貨框架連接到SPListTem。

這並不工作:

var fakeItem = new ShimSPListItem() 
     { 
      //delegates in here 
     }; 
MethodUnderTest(fakeItem); 
var item=(SPListItem) fakeListItem; 
Assert.AreEqual(item["someField"], expected, "Field value was not set correctly"); 

想必劇組允許自定義轉換運行給我們所需要的。

稍微容易與TypeMock遷移者可能是工作:

SPListItem fakeItem = new ShimSPListItem() 
     { 
      //delegates in here 
     }; 
MethodUnderTest(fakeItem); 
Assert.AreEqual(fakeListItem["someField"], expected, "Field value was not set correctly"); 
+0

只要你知道,創建一個墊片重定向在IL調用,而存根是一個派生類型(或執行),其中每個覆蓋或實現都會調用一個委託。您不需要經常使用墊片實例,但始終需要一個存根實例。小心不要觸及錯誤的。 – Magus

+0

Thanks @Magus - 我認爲在測試SharePoint時,我們可能比存根更經常使用墊片,因爲我們試圖從SharePoint API中分離出受測試的代碼,其中大部分代碼不存在殘缺。我明白瞭解這兩者之間的差異,我認爲這對於TypeMock遷移者來說是明確的(因爲TypeMock沒有相同的區別) – Chaholl

+0

即使大量使用墊片,您通常也不會這樣做通過使用實例。這是我的主要觀點。你似乎正在通過墊片,這實際上不是他們的工作方式。在ShimsContext中,您可以使用墊片重新路由呼叫而不通過它。 – Magus