mvccontrib 测试助手和验证 http post 路由和参数
Posted
技术标签:
【中文标题】mvccontrib 测试助手和验证 http post 路由和参数【英文标题】:mvccontrib test helper and verifying http post routes and parameters 【发布时间】:2011-01-10 16:51:52 【问题描述】:在我的 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 的 lambda 语句的方式,例如 foo.Setup(s => s.Foo(It.IsAny(), It.Is(i => i > 32)) 等等。即使我必须显式提供值,这也是可行的——我似乎无法理解所需的结构来传递这些显式值。
【问题讨论】:
你解决过这个问题吗? 不,从来没有——我的新应用程序的其他部分让我分心,单元测试这些特定的 POST 动作被搁置了。仍然很想知道如何最好地解决这个问题。 【参考方案1】:这是一个例子。假设您有以下操作:
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
参数。
【讨论】:
奇怪的是,这种情况对我不起作用。我在同一个控制器上有 2 个动作,一个标记为 HttpGet,一个标记为 HttpPost。我可以注释掉 HttpPost 方法(与 HttpGet 同名,但具有不同的签名),并且我的测试仍将通过使用您在上面的“您可以像这样测试它”评论中提供的示例。如果您有任何想法,这是我的问题的链接:***.com/questions/4157161/…【参考方案2】:使用 mvccontrib 辅助语法:
"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null));
您传递 null 因为 Foo(string id, Account accountToFoo) 方法永远不会作为路由测试的一部分执行。
【讨论】:
以上是关于mvccontrib 测试助手和验证 http post 路由和参数的主要内容,如果未能解决你的问题,请参考以下文章