Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在ASP.NET中使用Moq测试HTTP Post?_Asp.net Mvc_Unit Testing_Moq - Fatal编程技术网

Asp.net mvc 如何在ASP.NET中使用Moq测试HTTP Post?

Asp.net mvc 如何在ASP.NET中使用Moq测试HTTP Post?,asp.net-mvc,unit-testing,moq,Asp.net Mvc,Unit Testing,Moq,我有下面的动作方法我正在尝试moq测试。注意AcceptVerbs?我需要确保我正在测试 这里是方法 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create([Bind(Include = "Subject, Content")]Post post, HttpPostedFileBase imageFileName) { ... } 这是我的最低起订量代码 [TestMethod] public void Create_Ac

我有下面的
动作方法
我正在尝试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.
[TestMethod]
当Http\u Post\u成功时,public void Create\u Action\u snip\u sniop\u
{
//安排。
var mock=new mock();
SetupGet(m=>m.HttpContext.Request.HttpMethod).Returns(“POST”);
//剪掉一些其他的安排。
var控制器=后控制器;
controller.ControllerContext=mock.Object;
//表演。
var viewResult=controller.Create(post,image.Object)作为viewResult;
//断言。
Assert.IsNotNull(viewResult);
//TODO:测试请求是否为Http Post。

我需要做什么来验证请求是否是post?

作为单元测试运行时不会调用您的属性,因为它通常由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 ) );
 }
public void Only_posts_允许_执行我的行动()
{
var method=typeof(MyController).GetMethod(“MyAction”);
var attribute=method.GetCustomAttributes(typeof(AcceptVerbsAttribute),false)
.Cast()
.SingleOrDefault();
Assert.IsNotNull(属性);
aresequal(1,attributes.Count());
IsTrue(attributes.Contains(HttpVerbs.Post));
}

因此,您要说的是,您正在进行测试,以确保您已使用.Post动词修饰了特定的控制器方法。与测试该方法是否在请求时触发不同的是Http Post(因为这超出了此范围->它是框架内容)..?正确。调用筛选器的功能不在方法的范围内(在调用方法之前首先激发),因此如果应用了正确的属性,您将永远不会在方法中看到非POST。