2010-07-07 85 views
2

你好,我试图写一个测试我可以嘲笑一个HttpRequestBase返回这样的post值吗?请帮忙,因为它相当紧迫,我该如何实现这一目标?asp.net mvc rhino mocks mocking httprequest值

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


var mocks = new MockRepository(); 

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

基本上我有rquires我假装请求后的参数,而不是作为UI客户端不是一个HTML表单,形成价值观的要求,任何想法如何捏造/嘲笑的HttpRequest post数据?返回类型是一个名称VueueCollection

+0

您是否试图模拟测试控制器? – 2010-07-07 14:46:09

+0

实际上很少有情况下,您应该直接在控制器操作中使用http上下文。这是我要检查的第一件事。 “我真的需要这种依赖性吗?” – 2010-07-07 14:53:16

+0

H Guys谢谢,Ive更新了这个问题基本上我有一个需求需要模拟请求发布参数,而不是形式值,因为UI客户端不是html表单,任何想法如何伪造/模拟httprequest post params?返回类型是nameVaueCollection – Matthew 2010-07-07 14:55:10

回答

6

你不会喜欢听到这个,但你会以错误的方式去做。您应该使用模型进行输入,并让模型绑定器填充属性,而不是直接从请求参数中获取值。这会让你的生活,包括嘲笑变得更容易,因为你将提供一个模型作为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(); 
+0

如果我有一个类的方法不是使用HttpContext的控制器,我该如何模拟httpContext? – Monish 2014-06-09 11:06:11

+0

@Monish让它变得更简单,将HttpContextBase注入到构造函数中,并在创建测试类时提供模拟 – tvanfosson 2014-06-09 12:02:15

+0

感谢您的回复,tvanfosson。但我的问题有些不同。我正在为一个公共类(而不是控制器)编写单元测试。实际上,这个类的方法是从控制器的行为中调用的。但在我的单元测试中,没有控制器。我正在直接测试公开课。这个类的一个方法使用HttpContext。 – Monish 2014-06-09 15:16:17