asp.net mvc rhino mocks模拟httprequest值

时间:2010-07-07 13:30:29

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

嗨有没有办法模拟请求参数,在测试创建虚假请求值以运行测试时最好的方法是什么

会有一些像这样的工作吗?

        _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);

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您可以选择的最好的方法是创建一个可以模拟的类(即使用虚拟方法或运动和演员作为界面),并且只能访问HttpRequest < em>通过那个班级。

例如,如果您希望在页面处理过程中获取某些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是虚拟的,所以它可以被Rhino嘲笑。您可以使CookeHandler成为单例(在测试中可替换),您可以在UI页面上使用基于属性的注入,或者您可以使用像Unity这样的DI框架。

重点是您无法使用自动单元测试来测试所有内容,所以不要打扰。尽可能多地测试并保存其余部分以进行集成和手动用户验收测试。

答案 2 :(得分:0)

了解MVCContrib.TestHelper。它使用Rhino.Mocks为控制器创建一个完整的测试环境(模拟HttpContext,Request,Response,Session等)。请参阅:How do I use Rhino.Mocks to mock a ControllerContext

答案 3 :(得分:0)

我尝试创建一个HTTPRequest对象的新实例,并且能够模拟它。像Text writer这样的输入必须通过httpcontextbase或其他方式进行模拟。