2016-06-23 47 views
0

我正在爲我的MVC控制器功能使用Nunit和FakeItEasy。嘗試假冒幫手功能時遇到問題

我的測試代碼:

[Test] 
     public async Task Search_Success() 
     { 
      if (!isFakeInitialized) 
       InitializeFake(); 

      url = "/N/UserSvc/v1/Types?skip=0&take=" + Constants.MaxSearchRowNumber; 
      Types= A.CollectionOfFake<Type>(3); 
      List<Type> found=new List<Type>(Types); 
      A.CallTo(() => nFake.GetDataAsync<IEnumerable<Type>>(fakeHttpSession, url)).Returns(Types); 
      var fakeHelper = A.Fake<helperFunctions>(); 
      A.CallTo(() => FakeHelper.GetAvailableTypes(fakeHttpSession, found, true)).Returns(foundTypes); 
      //Act 
      var actionResult = await myController.SearchView(); 
      var viewResult = actionResult as ViewResult; 

      //Assert 
      Assert.IsNotNull(viewResult); 
      Assert.AreEqual("Search", viewResult.ViewName); 
     } 

我在

A.CallTo(() => nFakeHelper.GetAvailableTypes(fakeHttpSession, found, true)).Returns(foundTypes); 

錯誤獲取錯誤:不能轉換lambda表達式類型的對象,因爲它不是一個委託類型。

這裏是輔助函數代碼:

公開名單GetAvailableTypes(會話會話列表allTypes,布爾includeAllType) { 列出結果=新名單(); 返回結果; }

我該如何克服這個錯誤。

回答

0

如果沒有別的,您的A.CallTo應該失敗,因爲GetAvailableLicenseTypes不是virtual。不過,我對這個錯誤信息有點驚訝。 我試圖重現,但不得不修剪下來頗有幾分缺失代碼填寫,並最終得到

The current proxy generator can not intercept the specified method for the following reason: 
    - Non virtual methods can not be intercepted. 

您能夠包含更多的信息,從完整的錯誤,包括堆棧跟蹤?

0

var nmsFakeHelper = A.Fake<NMCHelperFunctions>(); A.CallTo(() => nmsFakeHelper.GetAvailableLicenseTypes(fakeHttpSession, foundLicense, true)).Returns(foundLicensTypes);

這兩條線是你的問題。

第一行將nmsFakeHelper聲明爲具體類型NMCHelperFunctions的僞造。

然後,第二行定義了GetAvailableLicenseTypes方法被調用時假的行爲。

在後臺,FakeItEasy決定使用什麼類型的假冒(模擬,存根等)。如果你問的假的類型是具體的,你會得到一個存根。但是,如果你想能夠定義行爲(定義返回值或驗證方法被調用等),你需要一個模擬而不是一個存根。

爲了讓FakeItEasy決定返回一個模擬而不是一個存根,你需要給它一個接口類型。這是因爲模擬需要能夠攔截方法調用,但在.NET中,只有在虛擬調用時才能攔截方法。當您使用的類型是一個接口時會發生這種情況,但是當您使用的類型是具體類型時不會發生。

所以要解決這個問題,你應該添加一個接口到NMCHelperFunctions類型,該類型包括(至少)GetAvailableLicenseTypes方法(以及任何其他方法)。

這意味着你的第一行更改爲以下(假設你的名字你的界面iNMCHelperFunctions): var nmsFakeHelper = A.Fake<iNMCHelperFunctions>(); 你的第二線將保持不變,並測試代碼現在應該工作。

您可能不得不重構應用程序代碼以使用接口類型而不是具體類型。這樣做有一些好處,因爲它允許組件可以交換,所以通過編寫一個遵守相同界面並切換到相同界面的新類,可以更容易地添加或更改將來的行爲。