在ASP.Net MVC中创建一个模拟URL引用来进行单元测试

kin*_*005 6 asp.net asp.net-mvc unit-testing

我目前正在测试我的应用程序,并且一直试图弄清楚如何创建自定义虚假URL引用来源.我试图对它进行硬编码,但是我发现它是只读的错误.这是我到目前为止所尝试的:

fakeController.HttpContext.Request.UrlReferrer.AbsolutePath = "http://www.yahoo.com";
Run Code Online (Sandbox Code Playgroud)

以及,

fakeController.Request.UrlReferrer = "http://www.yahoo.com";
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了一些关于如何为我的假控制器创建假/模拟URL引用的想法,但没有运气.欢迎任何建议.

注意:我正在使用Visual Studios内置的单元测试工具.

更新:

感谢大家到目前为止的建议,我非常愿意使用Visual Studio以外的任何其他单元测试系统,不幸的是,在我的工作中,我们只允许使用Visual Studio的内置系统,所以我必须使用我得到了什么.谢谢你,知道这些选项在那里很好.

tva*_*son 8

为HttpContext创建模拟请求,然后在返回Uri的Request上设置期望.使用RhinoMocks的示例.

 var context = MockRepository.GenerateMock<HttpContextBase>();
 var request = MockRepository.GenerateMock<HttpRequestBase>();
 request.Expect( r => r.UrlReferrer ).Returns( new Uri( "http://www.yahoo.com" ) ).Repeat.AtLeastOnce();
 context.Expect( c => c.Request ).Returns( request ).Repeat.Any();

 fakeController.HttpContext = context;
Run Code Online (Sandbox Code Playgroud)


lko*_*lko 5

tvanfosson 的答案方向正确,但有点过时。(授予OP无法使用MOQ,添加以供将来参考)

    // Dependency Mocks initialization ....
    ....
    MyController controller = new MyController(mock.Object, ...dependencies...);

    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    request.Setup(r => r.UrlReferrer).Returns(new Uri("http://www.site.com"));
    context.Setup(c => c.Request).Returns(request.Object);

    // Setting the HttpContext
    // HttpContext is read-only, but it is actually derived from the
    // ControllerContext, which you can set. 
    controller.ControllerContext = new ControllerContext(context.Object, 
        new RouteData(), controller);
    //target.HttpContext = context.Object; // outdated
Run Code Online (Sandbox Code Playgroud)

来自控制器上下文的 HttpContext


jpa*_*luz 1

我建议更改为模拟框架,例如 NMock 或 Rhino Mock,它允许您创建这些框架,并为给定调用返回特定值,例如该属性中的 get 方法。