如何使用nsubstitute和nunit模拟ApplicationUserManager以进行单元测试

时间:2015-01-21 10:42:17

标签: asp.net-mvc-5 nunit nsubstitute

我在使用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);
        }

1 个答案:

答案 0 :(得分:1)

substituting for a concrete class时发生此错误,但尚未提供所需的构造函数参数。如果MyClass构造函数有两个参数,则可以这样替换:

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

请记住,NSubstitute不能使用非虚方法,并且当替换类(而不是接口)时,在某些情况下可以执行实际代码。

Creating a substitute中对此进行了进一步解释。