Asp.net-Mvc

模擬 HttpPostedFileBase 和 InputStream 進行單元測試

  • March 25, 2013

我想測試以下程式碼行:

...
Bitmap uploadedPicture = Bitmap.FromStream(model.Picture.InputStream) as Bitmap;
...

圖片是我的模型類型 HttpPostedFileBase 中的一個屬性。所以我想模擬一個用於單元測試的 HttpPostedFileBase 屬性:

model.Picture = new Mock<HttpPostedFileBase>().Object;

完全沒有問題。

現在我必須模擬 InputStream,否則它為空:

model.Picture.InputStream = new Mock<Stream>().Object;

這不起作用,因為 InputStream 是只讀的(沒有 setter 方法):

public virtual Stream InputStream { get; }

有沒有一個好的和乾淨的方法來處理這個問題?一種解決方案是在派生類中為我的單元測試覆蓋 HttpPostedFileBase。還有什麼想法嗎?

您好 :) 我做了類似的事情,

   [TestInitialize]
   public void SetUp()
   {
       _stream = new FileStream(string.Format(
                       ConfigurationManager.AppSettings["File"],
                       AppDomain.CurrentDomain.BaseDirectory), 
                    FileMode.Open);

       // Other stuff
   }

在測試本身上,

   [TestMethod]
   public void FileUploadTest() 
   {
       // Other stuff

       #region Mock HttpPostedFileBase

       var context = new Mock<HttpContextBase>();
       var request = new Mock<HttpRequestBase>();
       var files = new Mock<HttpFileCollectionBase>();
       var file = new Mock<HttpPostedFileBase>();
       context.Setup(x => x.Request).Returns(request.Object);

       files.Setup(x => x.Count).Returns(1);

       // The required properties from my Controller side
       file.Setup(x => x.InputStream).Returns(_stream);
       file.Setup(x => x.ContentLength).Returns((int)_stream.Length);
       file.Setup(x => x.FileName).Returns(_stream.Name);

       files.Setup(x => x.Get(0).InputStream).Returns(file.Object.InputStream);
       request.Setup(x => x.Files).Returns(files.Object);
       request.Setup(x => x.Files[0]).Returns(file.Object);

       _controller.ControllerContext = new ControllerContext(
                                context.Object, new RouteData(), _controller);

       // The rest...
   }

希望這可以為您的解決方案提供一個想法:)

引用自:https://stackoverflow.com/questions/15622153