【问题标题】:How to I test an HTTP-Post with Moq in ASP.NET?如何在 ASP.NET 中使用 Moq 测试 HTTP-Post?
【发布时间】:2009-04-05 13:33:08
【问题描述】:

我有以下Action Method 我正在尝试moq 测试。注意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.

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

【问题讨论】:

    标签: asp.net-mvc unit-testing moq


    【解决方案1】:

    您的属性在作为单元测试运行时不会被调用,因为它通常由 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 ) );
     }
    

    【讨论】:

    • 所以你的意思是你正在测试以确保你已经用 .Post 动词 .. 装饰了特定的控制器方法,而不是测试该方法是在请求上触发的是 Http 发布的(因为这是超出此范围的管道方式 -> 它是框架的东西).. ?
    • 正确。调用过滤器的功能超出了方法的范围(在调用方法之前首先触发),因此如果应用了正确的属性,您将永远不会在方法中看到非 POST。
    猜你喜欢
    • 2016-06-15
    • 2021-01-25
    • 2013-02-04
    • 1970-01-01
    • 2014-05-02
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多