2010-07-07 71 views
1

嗨有没有办法来嘲笑请求参数,什么是测试,以便运行测试asp.net的MVC犀牛嘲笑嘲笑的HttpRequest值

,以制造假请求的值时,最好的办法了一些这样的事工作?

 _context = MockRepository.GenerateStub<HttpContext>(); 
     request = MockRepository.GenerateStub<HttpRequest>(); 

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

     SetupResult.For(request.Params).Return(collection); 
     SetupResult.For(_context.Request).Return(request); 

回答

0

HttpRequest功能大量的非虚拟属性和方法。你永远不会能够模拟它。如果你从Page.Request访问它,你甚至不能实例化一个新的并为你的测试设置它的值。这是UI很少(如果有的话)获得自动化测试的原因之一;这往往是不可能的。这就是为什么我们使用允许自动化测试的模式,例如MVC和MVVM:通过尽可能多地将处理逻辑推送到可测试的单独类,我们减少了我们需要执行的手动测试的数量。

你必须提供给您最好的办法是创建一个类,您可以模拟(即虚拟方法或运动和投作为一个接口),并只能访问HttpRequest通过这个类。

例如,如果你想获得一定的cookie值作为你的页面处理的部分,可以按如下所示创建一个CookieHandler类:

public class CookieHandler 
{ 
    private HttpRequest CurrentRequest; 

    public CookieHandler(HttpRequest request) 
    { 
     CurrentRequest = request; 
    } 

    public virtual HttpCookie UserLanguagePreference 
    { 
     get 
     { 
      return CurrentRequest.Cookies["UserLanguagePreference"].Name; 
     } 
    } 
} 

这不是一个理想的课堂,它只是例;因为UserLanguagePreference是虚拟的,它可以被犀牛嘲笑。你可能会让CookeHandler成为一个singleton(在你的测试中可以替换),你可以在你的UI页面上使用基于属性的注入,或者你可以使用像Unity这样的DI框架。

的一点是,你不能测试一切与自动化单元测试,所以不要打扰。尽可能多地进行测试,并节省剩下的时间进行集成和手动用户验收测试。

+0

嗨,谢谢你的帮助,我编辑了这个问题,你能告诉我这是否可能吗? – Matthew 2010-07-07 14:05:47

1

如上所述,你真的不希望在HttpRequest上有太多的直接依赖关系,因为它在这个时代是非常糟糕的设计。这个事实指出,你应该嘲笑HttpRequestBase,因为它在内部使用了rhino-mock友好的虚拟方法。

+0

非常好的建议;我不知道HttpRequestBase。但是这导致我得到了HttpRequestWrapper,这可能是原始提问者最好的选择。 – Randolpho 2010-07-07 14:58:11

0

我试着创建一个HTTPRequest对象的新实例,并能够嘲笑。像文本编写器这样的输入必须通过httpcontextbase或其他方式来模拟。