2010-07-14 64 views
1

我正在使用MvcContrib的测试助手和Rhino Mocks 3.5来测试ASP.NET MVC操作方法。我建立了我的假控制器像这样:尝试使用MvcContrib存根Server.MapPath测试助手和Rhino Mocks 3.5

var _builder = new TestControllerBuilder(); 
_builder.InitializeController(_controller); 

所以我得到的含有假HTTP服务器假的控制器等

然后我试图存根像这样

controller.Server.Stub(x => x.MapPath(Arg<string>.Is.Anything)).Return("/APP_DATA/Files/"); 
的方法使用Server.Mappath

但在我的测试方法中,对Server.MapPath(“/ APP_DATA/Files /”)的调用返回null。

这是测试

const string STOCK_NUMBER_ID = "1"; 
    const string FULL_FILE_PATH = "App-Data/Files"; 

    var controller = CreateStockController(); 
    _uploadedFileTransformer.Stub(x => x.ImageBytes).Return(new byte[10]); 
    _uploadedFileTransformer.Stub(x => x.ConvertFileToBytes(FULL_FILE_PATH)).Return(true); 

    controller.Server.Stub(x => x.MapPath(Arg<string>.Is.Anything)).Return("/App_Data/Files/"); 

    controller.AddImage(Guid.NewGuid(), STOCK_NUMBER_ID); 

我缺少什么?

+0

我们可以看看测试吗?看起来像一个可能缺少的repository.Playback()。 – PatrickSteele 2010-07-14 16:27:30

+0

我已将测试添加到OP。我认为我们不需要在Rhino Mocks v3.5中使用录制和播放功能 - 我错了吗? – 2010-07-14 16:33:50

+0

你可不可以贴'CreateStockController()'?我不熟悉你正在使用的测试助手,但是controller.Server在哪里创建的? – Grzenio 2010-07-14 16:39:36

回答

0

看起来这是MVCContrib中的一个错误(至少在我的机器上有 - v1.0.0.0)。当设置控制器上下文时,它使用Rhino.Mocks记录/重放模式,但是(这是错误),它不会将HttpServer模拟放入重放模式。它将所有其他内容放在重放模式中,但不是那种。

所以速战速决是做:

controller.Server.Replay(); 

作为测试你的“安排”一节的一部分。然后它工作正常。

+0

Patrick,我尝试了你的建议,我添加了controller.Server.Replay(),但我仍然有同样的问题。我在MVC2上使用MvcContrib v2.0.36.0。我似乎在这个问题上有很多年,所以最后我为我的操作方法添加了一个HTTPServerUtilityBase参数,并创建了一个自定义模型绑定器,它为我提供了一个Server对象。然后在我的测试中,我创建了自己的HttpServerUtilityBase存根,并删除了MapPath方法。它的所有工作都很好,但我宁愿TestHelper首先为我提供正确的存根。 – 2010-07-15 15:45:40

+0

好的。我尝试过的示例项目是MVC1。看起来这个错误在MVC2中依然存在。应该很容易从CodePlex中分离出代码,修复并提交。真高兴你做到了! – PatrickSteele 2010-07-15 16:39:41

1

旧帖子,但我正在寻找这个,我发现了一个解决方案,MvcContrib的TestHelper可能得到它修复,因为对我来说它的工作。

_builder.HttpContext.Server.Stub(s => s.MapPath("~/" + filepath)).Repeat.Once().Return(mapedPath);