在我們開始之前,你需要知道一個form以post方式上傳文件的方式,你將要增加一個特別的enctype attribute到form標簽上,為了這個麼,我們需要創建一個像這樣的form標簽:
<% using (Html.BeginForm("Edit", "Person", FormMethod.Post, new { enctype = "multipart/form-data" })) {%>
然後我們只需要增加一個Type為"file"的input,一個sumbit按鈕的表單.你必須確保input上有"name" attribute.我們也能任何一個我們想要的form上:
<table> <tr> <td><input type="file" id="picture" name="picture" /></td> </tr> <tr> <td><input type="submit" value="Upload" /></td> </tr> </table>
現在我們自己的表單了,准備好服務器端的Action.我們這麼做:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(HttpPostedFileBase picture) { if (picture != null) { picture.SaveAs("C:\wherever\" + picture.FileName); } }
漂亮吧!現在只剩下測試它了.我使用了Moq 3,我們只需要mock出一個文件,並放入方法中:
var personPicture = new Mock<HttpPostedFileBase>(); personPicture.Setup(i => i.FileName).Returns("person.jpg"); personPicture.Setup(i => i.InputStream).Returns(new MemoryStream(Encoding.UTF8.GetBytes(""))); var controller = new PersonController(); controller.Edit(personPicture.Object); personPicture.Verify(p => p.SaveAs("C:\wherever\person.jpg");
哇.所有能mock出所有我們有的東西,假裝控制器中少許屬性,調用方法,然後驗證圖片上適當的方法是否被調用.就是那麼簡單!
希望你已知道這些,但如果你不知,希望這篇post能幫到你.