Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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 rhino模拟httprequest值_Asp.net_Asp.net Mvc_Rhino Mocks - Fatal编程技术网

asp.net mvc rhino模拟httprequest值

asp.net mvc rhino模拟httprequest值,asp.net,asp.net-mvc,rhino-mocks,Asp.net,Asp.net Mvc,Rhino Mocks,我正在尝试编写一个测试,我可以模拟HttpRequestBase来返回这样的post值吗?我怎样才能做到这一点 var collection = new NameValueCollection(); collection.Add("Id", "1"); collection.Add("UserName", ""); var mocks = new MockRepository(); using (mocks.Record()) { Expect.Call(request

我正在尝试编写一个测试,我可以模拟HttpRequestBase来返回这样的post值吗?我怎样才能做到这一点

var collection = new NameValueCollection();
collection.Add("Id", "1");
collection.Add("UserName", "");


var mocks = new MockRepository();

  using (mocks.Record())
  {
      Expect.Call(requestBase.Params).Return(collection);
  }

基本上,我有一个要求,要求我模拟请求post参数,而不是表单值,因为UI客户端不是html表单,有没有想法如何伪造/模拟httprequest post参数?返回类型是nameVaueCollection

您可能不喜欢听这个,但您的做法是错误的。您应该使用模型作为输入,让模型绑定器填充属性,而不是直接从请求参数中获取值。这将使您的生活更加轻松,包括模拟,因为您将提供一个模型作为action方法的参数,而不必模拟HttpRequest对象

var model = new UserModel { ID = 1, UserName = string.Empty };

var controller = new FooController();

var result = controller.FooAction( model );
如果您必须使用这些参数,那么至少我建议您对模拟使用AAA语法

var request = MockRepository.GenerateMock<HttpRequestBase>();
var context = MockRepository.GenerateMock<HttpContextBase>();

var collection = new NameValueCollection();   
collection.Add("Id", "1");   
collection.Add("UserName", "");

context.Expect( c => c.Request ).Return( request ).Repeat.Any();
request.Expect( r => r.Params ).Return( collection ).Repeat.Any()

var controller = new FooController();
controller.ControllerContext = new ControllerContext( context, new RouteData(), controller );

var result = controller.FooAction();

...

context.VerifyAllExpectations();
request.VerifyAllExpectations();
var request=MockRepository.GenerateMock();
var context=MockRepository.GenerateMock();
var collection=新名称valuecollection();
集合。添加(“Id”、“1”);
集合。添加(“用户名”,“用户名”);
Expect(c=>c.Request).Return(Request.Repeat.Any();
request.Expect(r=>r.Params).Return(collection.Repeat.Any())
var controller=new FooController();
controller.ControllerContext=新的ControllerContext(上下文,新路由数据(),控制器);
var result=controller.FooAction();
...
verifyallexpections();
request.verifyallexpections();

您是否试图模拟以测试控制器?实际上,在很少的情况下,您需要在控制器操作中直接使用http上下文。这是我要检查的第一件事。“我真的需要这个依赖关系吗?”H伙计们,谢谢,我更新了这个问题基本上我有一个要求,要求我模拟请求post参数,而不是表单值,因为UI客户端不是html表单,你知道如何伪造/模拟httprequest post参数吗?返回类型为nameVaueCollection@Matthew,看看tvanfosson的答案。您不应该从请求中手动获取这些参数。只需将您的操作设置为将它们作为参数即可。更简单更干净。这就是我所说的。@Mattias-我知道你的意思,只是我们在做TDD,我提到的客户端是富客户端,不是html客户端,我需要针对请求参数编写测试,这可能吗?我还能怎么接近呢。感谢您的耐心如果我有一个不是使用HttpContext的controller类的方法,我如何模拟HttpContext?@Monish使它更简单,将HttpContextBase注入构造函数,并在创建Test下的类时提供模拟谢谢您的响应tvanfosson。但我的问题有些不同。我正在为一个公共类(不是控制器)编写单元测试。实际上,这个类的方法是从控制器的操作调用的。但是在我的单元测试中,没有控制器。我正在直接测试公共类。此类的一个方法使用HttpContext。@Monish-因此使用HttpContextBase并传入一个模拟instead@Jones当然,这是可能的。表单帖子将绑定到您的模型。您可以为所需的每个模型值组合创建单独的测试。创建对象,填充对象,并将其直接传递给操作。检查表单是否为模型发布了正确的变量是一项集成测试,您可以使用内存服务器或手动测试。如果您在视图中使用强类型帮助器,那么应该更容易确信表单与模型匹配。