6

在我的 Asp.net MVC 应用程序中,我在控制器上有两种方法,一种用于用户第一次到达视图时,另一种用于在所述视图上提交表单时。

public ActionResult Foo() {}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Foo(string id, Account accountToFoo) {}

在第二个操作中,有一个自定义模型绑定器正在组装我正在操作的帐户对象,尽管这并不重要。这一切都可以在服务器上进行本地测试。

我们努力编写单元测试来测试我们所有不同的视图是否被正确路由到,包括那些 HTTP POST。为此,我们一直在使用 mvccontrib 的测试助手。

测试变得非常简单

"~/account/foo/myusername".
       Route().
       ShouldMapTo<AccountController>(c => c.Foo("myusername"));

我的问题是在测试 POST 路由时,如何编写用于验证帖子是否接收准确值的 lambda,类似于上面的 GET 测试?

对于 POST,它看起来像:

"~/account/foo".
         WithMethod(HttpVerbs.Post).
         ShouldMapTo<AccountController>(a => something_something);

这是我遇到问题的 lambda 的 something_something 部分。使用任意值不起作用(“a => a.Foo(0, new Account()”)。如何将预期值指定为测试的一部分?

编辑 我希望有类似于 Moq 的 lambdas 语句的方式,例如 foo.Setup(s => s.Foo(It.IsAny(), It.Is(i => i > 32)) 等等. 即使我必须明确提供值,这也是可行的——我似乎无法理解所需的结构来传递那些明确的值。

4

2 回答 2

15

这是一个例子。假设您有以下操作:

public AccountController : Controller
{
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Foo(string id) 
    {
        return View();
    }
}

并注册了以下路线:

RouteTable.Routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "home", action = "index", id = "" }
);

你可以像这样测试它:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Post);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));

可能需要进行一些调整以包含Account您拥有的第二个参数。

于 2010-02-02T10:17:06.143 回答
2

使用 mvccontrib 帮助器语法:

"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null));

您传递 null 因为 Foo(string id, Account accountToFoo) 方法永远不会作为路由测试的一部分执行。

于 2010-02-10T14:44:22.837 回答