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 如何使用FakeiTasy将Request.IsAjaxRequest()模拟为true?_Asp.net Mvc_Unit Testing_Fakeiteasy - Fatal编程技术网

Asp.net mvc 如何使用FakeiTasy将Request.IsAjaxRequest()模拟为true?

Asp.net mvc 如何使用FakeiTasy将Request.IsAjaxRequest()模拟为true?,asp.net-mvc,unit-testing,fakeiteasy,Asp.net Mvc,Unit Testing,Fakeiteasy,以下是我想为其编写单元测试的代码片段: [HttpGet] public ActionResult Edit(string id) { if (Request.IsAjaxRequest()) { EditModel model = new EditModel(); ..... } return View(); } 我想为此操作编写单元测试,在这里我可以将Request.IsAjaxRequest()的结果伪造为true,

以下是我想为其编写单元测试的代码片段:

[HttpGet]
public ActionResult Edit(string id)
{
    if (Request.IsAjaxRequest())
    {
        EditModel model = new EditModel();    
        .....
    }
    return View();
}
我想为此操作编写单元测试,在这里我可以将
Request.IsAjaxRequest()
的结果伪造为true,这样我就可以为操作的其余代码编写测试

我试过跟随,但不起作用
\u request.Headers
始终为空,
request.IsAjaxRequest()
始终返回false:

[Fact]
public void Get_Edit_AjaxRequest_ExpectedActionCalled()
{
    HttpRequestBase _request = A.Fake<HttpRequestBase>();
    _request.Headers.Add("X-Requested-With", "XMLHttpRequest");
    _controller.ControllerContext = A.Fake<ControllerContext>();
    _controller.ControllerContext.HttpContext = _request;

    A.CallTo(() => _controller.Request).Returns(_request); 

    var result = _controller.Edit(1) as RedirectToRouteResult;
}
[事实]
public void Get\u Edit\u AjaxRequest\u ExpectedActionCalled()
{
HttpRequestBase_request=A.Fake();
_添加(“X-request-With”,“XMLHttpRequest”);
_controller.ControllerContext=A.Fake();
_controller.ControllerContext.HttpContext=\u请求;
A.CallTo(()=>_controller.Request)。返回(_Request);
var result=_controller.Edit(1)作为RedirectToRouteResult;
}

我总是将
Request.IsAjaxRequest()
设置为false。非常感谢您在这方面的任何帮助。谢谢

我设法克服了编译错误,并使用了的第10章中的一些信息,这是关于ASP.NET MVC的

一般来说,ASP.NET MVC类的设计不是为了让它们容易伪造,但我有一个测试设置,它会使
IsAjaxRequest
返回true。两个主要障碍是让控制器使用请求对象和确保请求对象返回我们想要的头。 第一部分并不难,但第二部分要求我们让请求对象使用具体的
NameValueCollection
。默认情况下它提供的伪造属性没有用处,因为正确的属性不是虚拟的。幸运的是,使用真实的NameValueCollection实现了这一点

试试这个:

[Fact]
public void Get_Edit_AjaxRequest_ExpectedActionCalled_Blair()
{
    HttpRequestBase _request = A.Fake<HttpRequestBase>();

    // NameValueCollection is effectively unfakeable due to non-virtual properties,
    // but a real one works just fine, so make sure the headers use one of those.
    A.CallTo(() => _request.Headers).Returns(new NameValueCollection());
    _request.Headers["X-Requested-With"] = "XMLHttpRequest";

    var httpContext = A.Fake<HttpContextBase>();
    A.CallTo(() => httpContext.Request).Returns(_request);

    _controller.ControllerContext = new ControllerContext(
        new RequestContext(httpContext, new RouteData()),
        _controller);

    var result = _controller.Edit(1) as RedirectToRouteResult;
}
[事实]
public void Get_Edit_AjaxRequest_ExpectedActionCalled_Blair()
{
HttpRequestBase_request=A.Fake();
//由于非虚拟属性,NameValueCollection实际上不可用,
//但是一个真正的应用程序运行得很好,所以确保头文件使用其中的一个。
A.CallTo(()=>_request.Headers).Returns(new NameValueCollection());
_request.Headers[“X-request-With”]=“XMLHttpRequest”;
var httpContext=A.Fake();
A.CallTo(()=>httpContext.Request).Returns(_Request);
_controller.ControllerContext=新的ControllerContext(
新建RequestContext(httpContext,new RoutedData()),
_控制器);
var result=_controller.Edit(1)作为RedirectToRouteResult;
}

请注意,在MVC框架中会有很多这样的陷阱,继续伪造它们可能会继续令人沮丧。您可能会发现一种更可持续的方法是将尽可能多的逻辑提取到不依赖MVC框架的简单的旧式可测试业务类中。

我正在尝试复制,但有很大的问题。我不是一个MVC爱好者,可能我的部分问题是我没有使用正确的版本(我使用的是VS2013附带的任何版本),而是
\u controller.ControllerContext.HttpContext=\u request
不编译(
HttpRequestBase
不是
RequestContext
)和
\u控制器。Edit(1)
不编译,因为
Edit
采用
字符串。你能指出我哪里出了问题,或者修正这个问题,让它至少可以编译吗?谢谢布莱尔提供的解决方案。。作为本书的参考。。这很有帮助。。。