1

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

像这样的东西会起作用吗?

        _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

4 回答 4

1

如前所述,您真的不希望对 HttpRequest 有太多直接依赖,因为它在当今时代是非常糟糕的设计。注意到这一事实,您应该查看模拟 HttpRequestBase,因为它在内部使用 rhino-mock 友好的虚拟方法。

于 2010-07-07T14:43:02.473 回答
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是虚拟的,所以可以被Rhino嘲讽。您可以创建CookeHandler一个单例(在您的测试中可替换),您可以在您的 UI 页面上使用基于属性的注入,或者您可以使用像 Unity 这样的 DI 框架。

关键是你不能用自动化单元测试来测试所有东西,所以不要打扰。尽可能多地进行测试,其余部分留给集成和手动用户验收测试。

于 2010-07-07T13:59:42.933 回答
0

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

于 2011-01-05T09:49:53.340 回答
0

查看 MVCContrib.TestHelper。它使用 Rhino.Mocks 为控制器(模拟 HttpContext、Request、Response、Session 等)创建一个完整的测试环境。请参阅:如何使用 Rhino.Mocks 模拟 ControllerContext

于 2010-07-07T18:57:04.817 回答