2010-02-10 57 views
5

我目前正在测试我的应用程序,并试图弄清楚如何创建一个自定义假URL引用链接。我试图硬编码它,但得到一个错误,它是只读的。以下是我试过到目前为止:在ASP.Net MVC中为单元测试创​​建一个模拟URL引用链接

fakeController.HttpContext.Request.UrlReferrer.AbsolutePath = "http://www.yahoo.com"; 

以及,

fakeController.Request.UrlReferrer = "http://www.yahoo.com"; 

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

注意:我使用的是Visual Studios内置的单元测试工具。

UPDATE:

谢谢大家的建议,到目前为止,我会更愿意使用任何其他单元测试系统的Visual Studio之外,不幸的是在这里我的工作中,我们只允许使用Visual Studio的更多内置系统,所以我必须与我所拥有的一起工作。不过谢谢你,很高兴知道这些选项在那里。

回答

1

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

7

为HttpContext创建一个模拟请求,然后在返回Uri的请求上设置一个期望值。使用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; 
+0

+1我开始使用起订量键入了类似的回答,但你打我给它 – 2010-02-10 18:05:27

+0

哎tvanfosson,试图与瞎搞这个代码片段,但我得到和错误的context.expect() 参数'1':不能从'System.Web.HttpRequestBase'转换为'System.Web.HttpRequest' – kingrichard2005 2010-02-10 18:53:29

1

您将需要创建一个完整的模拟HttpContext为了完成这个不幸的。而不是硬编码,我会强烈建议使用mock,因为这样可以避免设置你实际上不需要的对象。

我会建议查看Scott Hanselmann's MvcMockHelpers帖子,以了解涉及的内容(它包括Rhino和Moq的代码)。

2

tvanfosson's Answer是正确的方向,但有点过时。 (授予OP不能使用起订量,增加备查)

// 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 

HttpContext from Controller context

相关问题