2

我開着瘋狂在這裏,我得到了這個異常。我正在使用Typemock Isolator和Nunit單元測試Sharepoint 2010項目。我試圖模擬的是UserProfileManager的UserProfile集合。單元測試Sharepoint對象UserProfileManager

代碼來測試:

public void IterateUsers() 
    { 
     SPServiceContext context = SPServiceContext.GetContext(site); 
      if (profileManager == null) 
      { 
       profileManager = new UserProfileManager(context); 
      } 

      foreach (UserProfile profile in profileManager) 
      { 
       DoThingsThatAreNotRelevant(); 
      } 

     } 
    } 

我的測試代碼:

[Test] 
public void IterateUsersTest() 
{ 
    //SPSite 
    var fakeSite = Isolate.Fake.Instance<SPSite>(Members.ReturnRecursiveFakes); 
    Isolate.Swap.NextInstance<SPSite>().With(fakeSite); 

    //SPServiceContext 
    var fakeSPServiceContext = Isolate.Fake.Instance<SPServiceContext> (Members.ReturnRecursiveFakes); 
    Isolate.WhenCalled(() => SPServiceContext.GetContext(fakeSite)).WillReturn(fakeSPServiceContext); 

    //UserProfileManager 
    var fakeUserProfileManager = Isolate.Fake.Instance<UserProfileManager>(Members.ReturnRecursiveFakes); 
    Isolate.Swap.NextInstance<UserProfileManager>().With(fakeUserProfileManager); 

    //UserProfile 
    var fakeUserProfile = Isolate.Fake.Instance<UserProfile>(Members.ReturnRecursiveFakes); 
    Isolate.Swap.NextInstance<UserProfile>().With(fakeUserProfile); 

    Isolate.WhenCalled(() => fakeUserProfileManager).WillReturnCollectionValuesOf(new[] {fakeUserProfile, fakeUserProfile, fakeUserProfile}); 
} 

所以,我的計劃是嘲笑UserProfileManager返回fakeUserProfile的集合,所以我可以通過foreach循環迭代。 fakeUserProfile的內容並不重要,因爲我可以嘲笑沒有問題的行爲。

的事情是,當它試圖執行此行

Isolate.WhenCalled(() => fakeUserProfileManager).WillReturnCollectionValuesOf(new[] {fakeUserProfile, fakeUserProfile, fakeUserProfile}); 

我得到一個不錯的ArgumentOutOfRangeException。我做錯了什麼?

+0

根據[文檔](http://docs.typemock.com/isolator/##typemock.chm/Documentation/ReplacingCollectionsAAA.html),您的做法似乎是正確的。也許問題在於你創建它的方式。由於我從未使用過隔離器,所以恐怕我無法幫助。修復標籤,可能會引起人們的注意。 – 2012-02-17 14:38:11

回答

0

行:

Isolate.WhenCalled(() => fakeUserProfileManager).WillReturnCollectionValuesOf(new[] {fakeUserProfile, fakeUserProfile, fakeUserProfile}); 

是錯誤的!你需要以指定的方法爲它例如工作:

Isolate.WhenCalled(() => fakeUserProfileManager.SomeMethod()).WillReturnCollectionValuesOf 

你不能告訴它從一個假的情況下只能從該實例具體方法返回一個值。

+0

我也認爲,即使該行與文檔中的行完全一樣,所以我嘗試過使用此行: > Isolate.WhenCalled(()=> fakeUserProfileManager.GetEnumerator())。WillReturnCollectionValuesOf(new [] {fakeUserProfile,fakeUserProfile,fakeUserProfile}); 我得到了一個不同的異常,爲true,但仍然不起作用: >方法Microsoft.Office.Server.UserProfiles.ProfileManagerBase.GetEnumerator返回System.Collections.IEnumerator。只能在枚舉類型上使用WillReturnCollectionValuesOf()。 – 2012-02-21 09:04:11

+0

奇數 - 錯誤是當您使用WillReturn而不是WillReturnCollectionValueOf時創建的錯誤。 我想這就是Typemock的支持:) – 2012-02-21 10:28:57