【问题标题】:Unit testing controller action with onactionexecuting fired触发 onactionexecuting 的单元测试控制器操作
【发布时间】:2013-11-05 21:08:05
【问题描述】:

我想对控制器的动作进行单元测试,并且必须运行 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);

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

【问题讨论】:

    标签: asp.net-mvc unit-testing


    【解决方案1】:

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

    如果您谈论的是单元测试,您通常希望单独验证行为

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

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

    【讨论】:

    • 嗯...您可能是对的,但我只是认为让 OnActionExecuting 在执行我的操作之前完成其初始化一些变量等的工作更容易,而不是所有手动初始化测试方法。
    • 谢谢,这可能更容易,但您希望将您的操作过滤器/onActionExecuting 与控制器的单元测试方面分离。这些变量,您可以相应地剔除。他们为您提供预设答案 SUT(您的 Controller 的 Action 方法)您需要解耦隔离,您的测试将不那么复杂、精确,正如我在回答中提到的那样,您可以从单元测试中获得最大收益。
    • 我应用了你博客中描述的方法来测试一个动作是否被一个属性修饰,但是我得到了以下编译错误:“System.Array has no definition for Any”在这一行@987654322 @有什么想法吗?
    • oups,只需要 using System.Linq 指令抱歉,新手错误;)
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多