5

我有以下Action Method我正在尝试最小起订量测试。注意AcceptVerbs? 我需要确保我正在测试它。

这是方法。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Include = "Subject, Content")]Post post,
    HttpPostedFileBase imageFileName)
{
  ...
}

这是我的起订量代码...

[TestMethod]
public void Create_Action_snip_sniop_When_Http_Post_Is_Succesful()
{
    // Arrange.
    var mock = new Mock<ControllerContext>();
    mock.SetupGet(m => m.HttpContext.Request.HttpMethod).Returns("POST");

    // Snip some other arrangements.

    var controller = PostController;
    controller.ControllerContext = mock.Object;

    // Act.
    var viewResult = controller.Create(post, image.Object) as ViewResult;

    // Assert.
    Assert.IsNotNull(viewResult);

    // TODO: Test that the request was an Http-Post.

我需要做什么来验证请求是一个帖子?

4

1 回答 1

9

您的属性在作为单元测试运行时不会被调用,因为它通常由 ControllerActionInvoker 作为 Mvc“堆栈”的一部分调用。在这种情况下,我所做的是编写一个测试以确保将正确的属性应用于具有正确参数的操作。然后我相信框架会正确地完成它的工作。

这样做需要反思:

 public void Only_posts_are_allowed_to_my_action()
 {
       var method = typeof(MyController).GetMethod("MyAction");
       var attribute = method.GetCustomAttributes(typeof(AcceptVerbsAttribute),false)
                             .Cast<AcceptVerbsAttribute>()
                             .SingleOrDefault();

       Assert.IsNotNull( attribute );
       Assert.AreEqual( 1, attributes.Count() );
       Assert.IsTrue( attributes.Contains( HttpVerbs.Post ) );
 }
于 2009-04-05T13:56:03.920 回答