2011-08-17 10 views
0

我希望能夠模擬SPServer.Local返回的對象,但我似乎無法在typemock中執行此操作。在我調試的那一刻,我看到SPServer.Local返回一個SPServer類型的空對象。不應該typemock與我的假實例交換此實例?有什麼我做錯了嗎?代碼在SharePoint服務器上運行良好。嘲笑SPServer.Local

[TestInitialize] 
public void Setup() 
{ 
    fakeSite = Isolate.Fake.Instance<SPSite>(Members.ReturnRecursiveFakes); 
    Isolate.Swap.NextInstance<SPSite>().With(fakeSite); 
    fakeServer = Isolate.Fake.Instance<SPServer>(Members.ReturnRecursiveFakes); 
    Isolate.Swap.NextInstance<SPServer>().With(fakeServer); 
    sharePointStorageRepository = new SharePointStorageRepository(); 
} 


[TestMethod] 
[Isolated] 
public void CreateHRFolderMethodCreatesHRFolder() 
{ 
    // arrange 
    // some arrange logic here 

    // act 
    var actual = sharePointStorageRepository.Create(); 

    // assert 
    Assert.AreEqual(expected, actual); 
} 

這是代碼位的是正在運行:

internal static Guid GetSiteGuid(string serverRelativeUrl, string webApplicationName) 
{ 
    Guid? guid = null; 
    SPServer myServer = SPServer.Local; 
    foreach (var serviceInstance in myServer.ServiceInstances.Where(si => si.Service is SPWebService)){ 
     var service = (SPWebService) serviceInstance.Service; 
     var webapp = service.WebApplications.SingleOrDefault(wa => wa.DisplayName == webApplicationName); 
     if (webapp != null){ 
      var site = webapp.Sites.SingleOrDefault(wa => wa.ServerRelativeUrl == serverRelativeUrl); 
      if (site != null) guid = site.ID; 
     } 
    } 

    if (!guid.HasValue){ 
     throw new FileNotFoundException(
      String.Format(
       "Cannot find Site Collection with WebApplication \"{1}\" and ServerRelativeUrl \"{2}\" running on \"{0}\"", 
       myServer.Address, webApplicationName, serverRelativeUrl)); 
    } 

    return guid.Value; 
} 

謝謝大家!

回答

3

我不在SharePoint中工作,但我注意到:您實際上並沒有模擬SPServer.Local任何地方的返回。我認爲這是缺失的一步。我也不完全確定你需要SwapNextInstance,因爲我沒有看到任何實際創建SPServer對象的地方。

這將改變你的測試代碼:

[TestInitialize] 
public void Setup() 
{ 
    // I don't see where you're using SPSite, so I assume it's in code 
    // not being shown; otherwise you can remove this. 
    fakeSite = Isolate.Fake.Instance<SPSite>(Members.ReturnRecursiveFakes); 
    Isolate.Swap.NextInstance<SPSite>().With(fakeSite); 
    fakeServer = Isolate.Fake.Instance<SPServer>(Members.ReturnRecursiveFakes); 

    // INSTEAD OF THIS: Isolate.Swap.NextInstance<SPServer>().With(fakeServer); 
    // DO THIS: 
    Isolate.WhenCalled(() => SPServer.Local).WillReturn(fakeServer); 

    sharePointStorageRepository = new SharePointStorageRepository(); 
} 

這WhenCalled方法將意味着任何時候任何人詢問SPServer.Local,它會回報你的假實例。

請注意,我在被測試的代碼中看到您獲得了ServerInstances屬性。我沒有看到任何具體的返回值設置,所以我假設你在省略的「排列」邏輯中控制剩下的東西。

+0

謝謝!這符合預期!我必須有我的理解,交換下一個困惑的例子。我確實期望'Local'調用被交換。謝謝,現在我也知道我也可以模擬靜態! :)(使用免費試用版,所以不要完全理解產品的進出) – soniiic