Asp.net-Mvc
模擬 HttpPostedFileBase 和 InputStream 進行單元測試
我想測試以下程式碼行:
... 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... }希望這可以為您的解決方案提供一個想法:)