单元测试asp.net MVC控制器与构造函数注入

本文关键字:构造函数 注入 控制器 MVC asp net 单元测试 | 更新日期: 2023-09-27 18:18:43

我如何设置我的测试项目,以便我可以单元测试我的控制器,我不能从测试方法调用我的控制器动作,因为它需要依赖的接口对象。我不想实现任何模拟存储库。我想使用我现有的数据库存储库和业务逻辑,与集成测试相同。

我的项目结构如下:

  • MVC。Web
  • MVC。BL(接口与实现)
  • MVC。存储库(接口和实现)

存储库的例子:

public class UserRepository : IUserRepository
{
    private readonly IBaseUOW<DBEntitiesEntities> _dbContext;
    private readonly IBaseRepository<User> _userRepository;
    public UserRepository(IBaseUOW<MoynoECTNewEntities> dbContext)
    {
        _dbContext = dbContext;
        _userRepository = dbContext.GetRepository<User>();
    }
    public UserResponse GetUserList()
    {
        var response = new UserResponse {Acknowledge = AcknowledgeType.Success};
        var typeList = _userRepository.Get().OrderBy(x => x.UserName).ToList();
        response.UserList = typeList.ToList();
        return response;
    }
}

业务层示例:

public class UserBL : IUserBL
{
    public UserResponse GetUserList()
    {
        var response = new UserResponse();
        var userList = _userRepository.GetUserList();
        if (userList != null && userList.UserList.Count > 0)
        {
            response.UserList = userList.UserList.ToList();
        }
        else
        {
            response.Message = "No Data Found";
            response.Acknowledge = AcknowledgeType.Failure;
        }
        return response;
    }
}

控制器的例子:

public class AdminController : BaseController
{
    public readonly IUserBL _userBl;
    public readonly IUserRoleBL _userRoleBl;
    public AdminController(IUserRoleBL userRoleBl, IUserBL userBl)
    {
        _userRoleBl = userRoleBl;
        _userBl = userBl;
    }
    public ActionResult GetUserList()
    {
        var response = _userBl.GetUserList();
        return View("_GridViewUser", response.UserList);
    }
}

我的单元测试方法示例:

[TestClass]
public class AdminControllerTest
{
    [TestMethod]
    public void Check_UserMaster_ViewName()
    {
       //assemple
        var controller = // how to call controller ?
       // act
        var result= // controller.GetUserList() as ViewResult;
       // assert
        Assert.AreEqual("UserMaster", result.ViewName);
    }
}

单元测试asp.net MVC控制器与构造函数注入

我不想实现模拟存储库,直接想使用我现有的数据库存储库

嗯,我认为这是错误的方法,因为你是单元测试类,这意味着所有的依赖关系都不应该影响测试的有效性,但这是你的决定。

在测试中传入一个"真实"存储库的实例。

var userRoleBL = new UserBL();
var userBL = new UserRoleBL();
var controller = new AdminController(userRoleBL, userBL);
// test the controller

正如@D Stanley所说,您应该只测试控制器返回适当的结果,而不是测试其他层,数据库等是否正常工作。

但是,要在单元测试中创建控制器,请使用:
var controller = new AdminController(any arguments/contexts here);