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);
}
是的,但我怎麼能創建一個真正的類,不執行真正的代碼,而是隻調用傳遞給它的回調的替代品。我嘗試過使用[when-do回調](http://nsubstitute.github.io/help/callbacks),儘管它調用了回調函數,但它仍然調用真正的代碼。如果沒有,可以用moq來實現嗎? – Cizaphil 2015-01-22 09:45:09
非虛擬成員中的構造函數代碼和代碼將始終運行。我相信Moq,FakeItEasy和RhinoMocks都有類似的限制,儘管這些項目值得檢查和/或向SO發佈一般性的.net模擬問題。確保真正的代碼不會運行的最好方法是使用一個接口(因爲它們沒有真正的代碼)。如果您無法編輯原始類,則有一種選擇是使用適配器模式使原始類符合接口。 – 2015-01-22 11:10:05
非常感謝,我終於解決了這個問題,並通過使用Moq擴展方法嘲笑'IUserStore'和'IUserPhoneNumberStore ',並返回所需的'Task '來通過測試。雖然看起來有點亂,但它的工作原理。 –
Cizaphil
2015-01-22 12:39:58