单元测试 asp.net 带有构造函数注入的 MVC 控制器
Unit testing asp.net MVC controller with constructor injection
我如何设置我的测试项目以便我可以对我的控制器进行单元测试,
我无法从测试方法调用我的控制器操作,因为它需要依赖接口对象。
我不想实现任何模拟存储库。
我想使用与集成测试相同的现有数据库存储库和业务逻辑。
我的项目结构如下:
- MVC.Web
- MVC.BL(接口与实现)
- MVC.Repository(接口和实现)
存储库示例:
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);
}
}
I don't want to implement mock repository and directly want to use my existing database repository
好吧,我认为这是错误的方法,因为您正在 单元测试 class,这意味着所有依赖项不应影响测试的有效性,但那是您的打电话。
只需在测试中传入 "real" 存储库的一个实例。
var userRoleBL = new UserBL();
var userBL = new UserRoleBL();
var controller = new AdminController(userRoleBL, userBL);
// test the controller
正如@D Stanley 所说,您应该只测试控制器 returns 适当的结果,而不是其他层、数据库等是否正常工作。
但是,要在单元测试中创建控制器,请使用:
var controller = new AdminController(any arguments/contexts here);
我如何设置我的测试项目以便我可以对我的控制器进行单元测试, 我无法从测试方法调用我的控制器操作,因为它需要依赖接口对象。 我不想实现任何模拟存储库。 我想使用与集成测试相同的现有数据库存储库和业务逻辑。
我的项目结构如下:
- MVC.Web
- MVC.BL(接口与实现)
- MVC.Repository(接口和实现)
存储库示例:
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);
}
}
I don't want to implement mock repository and directly want to use my existing database repository
好吧,我认为这是错误的方法,因为您正在 单元测试 class,这意味着所有依赖项不应影响测试的有效性,但那是您的打电话。
只需在测试中传入 "real" 存储库的一个实例。
var userRoleBL = new UserBL();
var userBL = new UserRoleBL();
var controller = new AdminController(userRoleBL, userBL);
// test the controller
正如@D Stanley 所说,您应该只测试控制器 returns 适当的结果,而不是其他层、数据库等是否正常工作。
但是,要在单元测试中创建控制器,请使用:
var controller = new AdminController(any arguments/contexts here);