2

我想对控制器的操作进行单元测试,并且必须先运行 OnActionExecuting 过滤器才能正确执行操作。

我使用了许多动作过滤器,所以我不想在每次进行测试时手动执行它们。

如果我像下面这样直接调用控制器操作方法,我可以获得结果但不执行过滤器。

ViewResult vr = myController.MyAction("hello world") as ViewResult;
Assert.AreEqual("View1", vr.ViewName);

我发现了如何在调用这样的操作时执行操作过滤器:

var routeData = new RouteData();
routeData.Values["controller"] = "MyController";
routeData.Values["action"] = "MyAction";

var rc = new RequestContext(new HttpContextWrapper(HttpContext.Current), routeData);
(myController as IController).Execute(rc);

但是我找不到获得动作结果的方法,是否可以触发动作过滤器并获得动作结果?

4

1 回答 1

0

我认为您在这里遗漏了几点。

如果您正在谈论单元测试,您通常希望单独验证行为。

我会亲自单独测试动作过滤器并单独测试您的控制器动作方法。如果您想确保 Controller 的 Action 方法使用某个 Filter 属性,那就是一个单独的单元测试。为此,您可以使用类似的东西。

这样做的好处是您可以孤立地发现问题,而不必担心其他依赖关系。通过这种方式自动化单元测试,您可以获得最大的好处。

于 2013-11-06T10:54:32.013 回答