2010-07-14 71 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); 
相關問題