2015-01-21 186 views
0

我在使用nsubstitute和nunit模擬ApplicationUserManager類來測試我的動作方法時遇到問題。這是嘲笑課堂的方式。如何模擬ApplicationUserManager使用nsubstitute和nunit進行單元測試

var _userManager = Substitute.For<ApplicationUserManager>(); 

在我的系統中,我正在使用構造函數注入注入類。當我運行測試時,我收到此錯誤消息。

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: JobHub.Web.Identity.ApplicationUserManager. 
Could not find a parameterless constructor. 

我的問題是如何正確使用嘲弄作爲NSubstitue現在用的是類的SetPhoneNumberAsync()方法這個類。

編輯 順便說一句,這裏是一段代碼,我試圖測試

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Create(UserProfileView model) 
     { 
      if (ModelState.IsValid) 
      { 
       var userId = User.Identity.GetUserId(); 

       var profile = model.MapToProfile(userId); 

       if (CommonHelper.IsNumerics(model.PhoneNo)) 
       { 
        await _userManager.SetPhoneNumberAsync(userId, model.PhoneNo); 
       } 

       if (model.ProfileImage != null) 
       { 
        profile.ProfileImageUrl = await _imageService.SaveImage(model.ProfileImage); 
       } 

       _profileService.AddProfile(profile); 
       _unitofWork.SaveChanges(); 

       //Redirect to the next page (i.e: setup experiences) 
       return RedirectToAction("Skills", "Setup"); 
      } 
      return View("UserProfile", model); 
     } 

回答

1

出現此錯誤substituting for a concrete class的時候,但尚未提供所需的構造函數的參數。如果MyClass構造函數有兩個參數,它可以取代這樣的:

var sub = Substitute.For<MyClass>(firstArg, secondArg); 

請記住,NSubstitute不能與非虛擬方法的工作,併爲班代時(而不是接口),也有一些真正的代碼可以執行的場合。

這在Creating a substitute中有進一步的解釋。

+0

是的,但我怎麼能創建一個真正的類,不執行真正的代碼,而是隻調用傳遞給它的回調的替代品。我嘗試過使用[when-do回調](http://nsubstitute.github.io/help/callbacks),儘管它調用了回調函數,但它仍然調用真正的代碼。如果沒有,可以用moq來實現嗎? – Cizaphil 2015-01-22 09:45:09

+0

非虛擬成員中的構造函數代碼和代碼將始終運行。我相信Moq,FakeItEasy和RhinoMocks都有類似的限制,儘管這些項目值得檢查和/或向SO發佈一般性的.net模擬問題。確保真正的代碼不會運行的最好方法是使用一個接口(因爲它們沒有真正的代碼)。如果您無法編輯原始類,則有一種選擇是使用適配器模式使原始類符合接口。 – 2015-01-22 11:10:05

+0

非常感謝,我終於解決了這個問題,並通過使用Moq擴展方法嘲笑'IUserStore '和'IUserPhoneNumberStore ',並返回所需的'Task '來通過測試。雖然看起來有點亂,但它的工作原理。 – Cizaphil 2015-01-22 12:39:58

相關問題