【发布时间】:2023-04-01 04:03:01
【问题描述】:
我正在尝试对我的控制器进行单元测试,并且我使用默认的 MVC 3 AccountController 单元测试作为基础。到目前为止,我的控制器看起来像:
public partial class HomeController : MyBaseController
{
public HomeController(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; }
public virtual ActionResult Index()
{
return View();
}
public virtual ActionResult About()
{
return View();
}
}
MyBaseController 的代码如下:
public class MyBaseController : Controller
{
public MyJobLeadsBaseController()
{
CurrentUserId = 0;
}
protected override void Initialize(RequestContext requestContext)
{
if (MembershipService == null) { MembershipService = new AccountMembershipService(); }
base.Initialize(requestContext);
// If the user is logged in, retrieve their login id
var user = MembershipService.GetUser();
if (user != null)
CurrentUserId = (int)user.ProviderUserKey;
}
public int CurrentUserId { get; set; }
public IMembershipService MembershipService { get; set; }
protected IUnitOfWork _unitOfWork;
}
当我运行实际站点时,一切正常,断点显示Initialize() 被正确触发。但是,以下单元测试从不运行Initialize(RequestContext) 方法:
[TestMethod]
public void Index_Shows_When_Not_Logged_In()
{
// Setup
HomeController controller = new HomeController(_unitOfWork);
controller.MembershipService = new MockMembershipService(null);
SetupController(controller);
// Act
ActionResult result = controller.Index();
// Verify
Assert.IsNotNull(result, "Index returned a null action result");
Assert.IsInstanceOfType(result, typeof(ViewResult), "Index did not return a view result");
}
protected static void SetupController(Controller controller)
{
RequestContext requestContext = new RequestContext(new MockHttpContext(), new RouteData());
controller.Url = new UrlHelper(requestContext);
controller.ControllerContext = new ControllerContext
{
Controller = controller,
RequestContext = requestContext
};
}
通过这个单元测试进行调试表明,被覆盖的MyBaseController.Initialize() 根本不会被调用。这会导致我的 CurrentUserId 属性未在单元测试中设置,而是在实时系统上设置的问题。
我还需要做什么才能触发Initialize() 被调用?
【问题讨论】:
标签: c# asp.net-mvc unit-testing controller