2011-04-01 76 views
9

你好我是TDD開發的新手。
我碰到這個職位Using asp.net mvc to upload file
菲爾哈克指出,一類可用於文件上傳控件,他在其中使用默認HttpFileCollectionValueProvider:如何進行單元測試Asp.net MVC fileUpload

 
[HttpPost] 
public ActionResult Index(HttpPostedFileBase file) { 

    if (file.ContentLength > 0) { 
    var fileName = Path.GetFileName(file.FileName); 
    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
    file.SaveAs(path); 
    } 

    return RedirectToAction("Index"); 
}

值的形式界定爲

<form action="" method="post" enctype="multipart/form-data"> 
    <label for="file">Filename:</label> 
    <input type="file" name="file" id="file" /> 
    <input type="submit" /> 
</form> 

請注意,HttpPostedFileBase被解析爲控制器中的參數,其名稱爲「file」,並作爲索引控制器中的解析參數。

我有兩個問題:
1.如何驗證file.SaveAs方法?
2.我不太清楚如何進行單元測試。在測試控制器文件中,我應該有一個假的HttpPostedFileBase,但它是密封的。有沒有人有一些處理這個問題的策略?

非常感謝!

+0

試試這個:[ASP.NET MVC:單元測試文件上傳與Moq](http://csainty.blogspot.com/2009/01/aspnet-mvc-unit-test-file-upload-with.html) – 2011-04-01 15:24:57

+0

感謝您的回答。問題是在Christ的文章中他沒有將HttpPostedFileBase解析爲控制器的參數。但是,在Phil的方法中,控制器應該將HttpPostedFileBase作爲參數綁定到HttpFileCollectionValueProvider。所以這是我的單元測試問題... – Seen 2011-04-01 15:47:15

回答

7

我的道歉,如果這不是你問什麼,但我只會嘲笑HttpPostedFileBase在您的測試:

var file = MockRepository.GenerateStub<HttpPostedFileBase>(); 

,然後設置任何期望:

file.Expect(f => f.ContentLength).Return(1); 
file.Expect(f => f.FileName).Return("myFileName"); 

再通過這你的控制器方法:

controller.Index(file); 

所以你可以嘲笑你的文件的行爲。我不確定.SaveAs--你是否重寫了這個方法?

+0

謝謝你的回答。我發現問題是我沒有爲Moq設置正確的存儲庫。我查看了Moq的文檔並獲得了正確的代碼。 – Seen 2011-04-01 16:35:54