Asp.net mvc 基于控制器的依赖注入单元测试
我很累,需要填写字段,然后登录注销做一个简单的测试 我搜索了xUnit和NUnit,发现了几个Tuturial,但是。我想测试我对AccountController(asp.net core 2 mvc)的修改,我使用一个存储库将逻辑放入这个repo 问题是如何安排所有这些依赖注入的测试 控制器示例。Asp.net mvc 基于控制器的依赖注入单元测试,asp.net-mvc,unit-testing,dependency-injection,Asp.net Mvc,Unit Testing,Dependency Injection,我很累,需要填写字段,然后登录注销做一个简单的测试 我搜索了xUnit和NUnit,发现了几个Tuturial,但是。我想测试我对AccountController(asp.net core 2 mvc)的修改,我使用一个存储库将逻辑放入这个repo 问题是如何安排所有这些依赖注入的测试 控制器示例。 namespace Inside.Controllers { [Authorize] [Route("[controller]/[action]")] public class AccountCo
namespace Inside.Controllers
{
[Authorize]
[Route("[controller]/[action]")]
public class AccountController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IEmailSender _emailSender;
private readonly ILogger _logger;
private readonly IUsersRepository _users;
public AccountController(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
IEmailSender emailSender,
ILogger<AccountController> logger,
IUsersRepository users
)
{
_userManager = userManager;
_signInManager = signInManager;
_emailSender = emailSender;
_logger = logger;
_users = users;
}
[HttpGet]
[AllowAnonymous]
public IActionResult RegisterFirstUser(string returnUrl = null)
{
if (!_users.HasUsersInDB())
{
return RedirectToAction(nameof(SetupWebApp));
}
if (!_users.HasOnlySystemUser())
{
return RedirectToAction(nameof(Login)); ;
}
ViewData["ReturnUrl"] = returnUrl;
return View();
}
}
.Controllers内部的命名空间
{
[授权]
[路由(“[控制器]/[操作]”)]
公共类AccountController:控制器
{
私有只读用户管理器_UserManager;
专用只读签名管理器\u签名管理器;
私人只读IEmailSender\u emailSender;
专用只读ILogger\u记录器;
私人只读IUsersRepository用户;
公共账户控制员(
用户管理器用户管理器,
SignInManager SignInManager,
电邮发送者,
ILogger记录器,
IUSERS替代用户
)
{
_userManager=userManager;
_signInManager=signInManager;
_emailSender=emailSender;
_记录器=记录器;
_用户=用户;
}
[HttpGet]
[异名]
public IActionResult RegisterFirstUser(字符串返回URL=null)
{
if(!\u users.HasUsersInDB())
{
返回重定向到操作(名称(SetupWebApp));
}
if(!\u users.HasOnlySystemUser())
{
返回重定向到操作(nameof(Login));
}
ViewData[“ReturnUrl”]=ReturnUrl;
返回视图();
}
}
现在我不知道如何做一个测试来测试这个控制器,因为它有很多依赖注入
很抱歉提出了这个新手问题。:p您可以很容易地使用它。假设您的控制器具有以下签名:
public class UsersController : Controller
{
private IUserRepository _userRepository;
private ApplicationUserManager _userManager;
private ApplicationSignInManager _signInManager;
public UsersController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, IUserRepository userRepository)
{
UserManager = userManager;
SignInManager = signInManager;
_userRepository = userRepository;
}
...
}
然后,此测试将如下所示(使用Moq)
[TestClass]
公共类UsersControllerTests
{
私有模拟用户存储库;
私人模拟用户管理器;
私人模拟签名管理员;
私有用户控制器(controller);;
私有模拟用户商店;
私人模拟管理员;
[测试初始化]
公共作废设置()
{
_userRepository=newmock();
_userStore=newmock();
_authManager=newmock();
_userManager=newmock(_userStore.Object);
_signInManager=new Mock(_userManager.Object,_authManager.Object);
_控制器=新用户控制器(_userManager.Object、_signInManager.Object、_userRepository.Object);
//仅当您希望在测试中使用请求对象时才执行此操作
var returnUrl=新Uri(“http://www.example.com");
var httpContext=new Mock();
var request=newmock();
Setup(x=>x.Request).Returns(Request.Object);
Setup(x=>x.Url).Returns(新Uri(“http://localhost:123"));
var requestContext=newrequestcontext(httpContext.Object,new RouteData());
_controller.Url=新的UrlHelper(requestContext);
}
用mock或stub替换注入服务的实现。userManager
在控制器中做什么?生成一个stub类,该类可能返回强制(但预期)响应,例如。HasUsersInDb()
将始终返回true。
[TestClass]
public class UsersControllerTests
{
private Mock<IUserRepository> _userRepository;
private Mock<ApplicationUserManager> _userManager;
private Mock<ApplicationSignInManager> _signInManager;
private UsersController _controller;
private Mock<IUserStore<ApplicationUser>> _userStore;
private Mock<IAuthenticationManager> _authManager;
[TestInitialize]
public void SetUp()
{
_userRepository = new Mock<IUserRepository>();
_userStore = new Mock<IUserStore<ApplicationUser>>();
_authManager = new Mock<IAuthenticationManager>();
_userManager = new Mock<ApplicationUserManager>(_userStore.Object);
_signInManager = new Mock<ApplicationSignInManager>(_userManager.Object, _authManager.Object);
_controller = new UsersController(_userManager.Object, _signInManager.Object, _userRepository.Object);
//only do this if you want to use request object in your tests
var returnUrl = new Uri("http://www.example.com");
var httpContext = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
httpContext.Setup(x => x.Request).Returns(request.Object);
request.Setup(x => x.Url).Returns(new Uri("http://localhost:123"));
var requestContext = new RequestContext(httpContext.Object, new RouteData());
_controller.Url = new UrlHelper(requestContext);
}