【问题标题】:asp.net mvc rhino mocks mocking httprequest valuesasp.net mvc rhino mocks mocking httprequest 值
【发布时间】:2010-07-07 14:43:30
【问题描述】:

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

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


var mocks = new MockRepository();

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

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

【问题讨论】:

  • 您是否尝试模拟测试控制器?
  • 实际上很少有需要在控制器操作中直接使用 http 上下文的情况。这是我要检查的第一件事。 “我真的需要这种依赖吗”。
  • H 伙计们,谢谢,我更新了问题基本上我有一个要求,要求我模拟请求发布参数而不是表单值,因为 UI 客户端不是 html 表单,任何想法如何伪造/模拟 httprequest 帖子参数?返回类型是 nameVaueCollection
  • @Matthew,看看 tvanfosson 的回答。您不应从请求中手动获取这些参数。只需将您的操作设置为将它们作为参数即可。更容易和更清洁。这就是我所说的。
  • @Mattias- 我知道你的意思,只是我们正在做 TDD,而我提到的客户端是富客户端,而不是 html 客户端,我需要针对请求参数编写测试,这可能吗?我还能如何接近。感谢您的耐心等待

标签: asp.net asp.net-mvc rhino-mocks


【解决方案1】:

你不会喜欢听这个,但是你用错了方法。您应该使用模型作为输入并让模型绑定器填充属性,而不是直接从请求参数中获取值。这将使您的生活(包括模拟)变得更加轻松,因为您将提供模型作为操作方法的参数,而不必模拟 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();

【讨论】:

  • 如果我有一个非控制器类的方法使用 HttpContext,我该如何模拟 httpContext?
  • @Monish 让它更简单,将 HttpContextBase 注入构造函数并在创建被测类时简单地提供模拟
  • 感谢您的回复,tvanfosson。但我的问题有些不同。我正在为公共类(不是控制器)编写单元测试。实际上,这个类的方法是从控制器的动作中调用的。但是在我的单元测试中,没有控制器。我正在直接测试公共课程。此类的一种方法使用 HttpContext。
  • @Monish - 所以使用 HttpContextBase 并传入一个模拟
  • @Jones 当然,这是可能的。表单帖子绑定到您的模型。您为所需的每个模型值组合创建一个单独的测试。创建对象,填充它,然后将它直接传递给动作。检查表单是否为模型发布了正确的变量是一项集成测试,您可以使用内存服务器或手动测试。如果您在视图中使用强类型帮助器,则应该更容易确信表单与模型匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2011-04-25
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多