我在使用nsubstitute和nunit模拟ApplicationUserManager
类来测试我的操作方法时遇到了问题。这是嘲笑班级的方式。
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);
}
答案 0 :(得分:1)
substituting for a concrete class时发生此错误,但尚未提供所需的构造函数参数。如果MyClass
构造函数有两个参数,则可以这样替换:
var sub = Substitute.For<MyClass>(firstArg, secondArg);
请记住,NSubstitute不能使用非虚方法,并且当替换类(而不是接口)时,在某些情况下可以执行实际代码。
Creating a substitute中对此进行了进一步解释。