Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 基于控制器的依赖注入单元测试_Asp.net Mvc_Unit Testing_Dependency Injection - Fatal编程技术网

Asp.net mvc 基于控制器的依赖注入单元测试

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

我很累,需要填写字段,然后登录注销做一个简单的测试

我搜索了xUnit和NUnit,发现了几个Tuturial,但是。我想测试我对AccountController(asp.net core 2 mvc)的修改,我使用一个存储库将逻辑放入这个repo

问题是如何安排所有这些依赖注入的测试

控制器示例。

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);
    }