因此,我在BaseController类中重写OnActionExecuted来设置BaseViewModel的CurrentUser属性。我希望能够对此进行单元测试,但不知道如何进行。
代码如下:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is ViewResult && ((ViewResult)filterContext.Result).ViewData.Model != null)
{
((BaseViewModel)((ViewResult)filterContext.Result).ViewData.Model).CurrentUser = CurrentUser;
}
base.OnActionExecuted(filterContext);
}下面是测试结果:
BaseController controller = new BaseController();
Mock<ActionExecutedContext> MockActionExecutedContext = new Mock<ActionExecutedContext>();
MockActionExecutedContext.Setup(ctx => ctx.Result).Returns(new ViewResult());
controllerAccessor.OnActionExecuted(MockActionExecutedContext.Object);
ViewResult vr = MockActionExecutedContext.Object.Result as ViewResult;
BaseViewModel model = vr.ViewData.Model as BaseViewModel;
User currentUser = model.CurrentUser;
Assert.NotNull(currentUser);当我运行测试时,我得到了错误:
System.NotSupportedException : Invalid setup on a non-virtual member: ctx => ctx.Result我知道我可以在每个派生控制器的单元测试中测试属性,但必须有一种更干净的方法来做到这一点。有什么想法吗?
发布于 2012-02-11 17:27:26
我不认为你需要嘲笑ActionExecutedContext。只需创建一个实际的ActionExecutedContext传递给您的控制器即可。我使用了一些自由,但请考虑下面的控制器代码:
public class BaseController : Controller
{
public User CurrentUser { get; set; }
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is ViewResult && ((ViewResult)filterContext.Result).ViewData.Model != null)
{
((BaseViewModel)((ViewResult)filterContext.Result).ViewData.Model).CurrentUser = CurrentUser;
}
base.OnActionExecuted(filterContext);
}
public void controllerAccessor(ActionExecutedContext filterContext)
{
OnActionExecuted(filterContext);
}
}下面的测试代码在我的机器上运行:
[TestMethod]
public void YourTest()
{
// Arrange
var inUser = new User();
BaseController controller = new BaseController() { CurrentUser = inUser };
var ctx = new ActionExecutedContext();
var inVr = new ViewResult();
var baseVm = new BaseViewModel();
inVr.ViewData.Model = baseVm;
ctx.Result = inVr;
// Act
controller.controllerAccessor(ctx);
// Assert
ViewResult outVr = (ViewResult)ctx.Result;
BaseViewModel model = (BaseViewModel)outVr.ViewData.Model;
User outUser = model.CurrentUser;
Assert.AreEqual(inUser, outUser);
}https://stackoverflow.com/questions/5195405
复制相似问题