asp.net-mvc – Mocking HttpPostedFileBase和InputStream进行单元测试

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – Mocking HttpPostedFileBase和InputStream进行单元测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想测试以下代码行:
  1. ...
  2. Bitmap uploadedPicture = Bitmap.FromStream(model.Picture.InputStream) as Bitmap;
  3. ...

图片是我的模型类型HttpPostedFileBase中的一个属性.
所以我想模拟一个HttpPostedFileBase属性进行单元测试:

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

完全没问题.

现在我必须模拟InputStream,否则为null:

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

这不工作,因为InputStream是只读(没有setter方法):

  1. public virtual Stream InputStream { get; }

有没有一个好的和干净的方式来处理这个问题?
一个解决方案是在我的单元测试的派生类中覆盖HttpPostedFileBase.
任何其他想法?

解决方法

你好:)我做了类似的事情,
  1. [TestInitialize]
  2. public void SetUp()
  3. {
  4. _stream = new FileStream(string.Format(
  5. ConfigurationManager.AppSettings["File"],AppDomain.CurrentDomain.BaseDirectory),FileMode.Open);
  6.  
  7. // Other stuff
  8. }

而在测试本身,

  1. [TestMethod]
  2. public void FileUploadTest()
  3. {
  4. // Other stuff
  5.  
  6. #region Mock HttpPostedFileBase
  7.  
  8. var context = new Mock<HttpContextBase>();
  9. var request = new Mock<HttpRequestBase>();
  10. var files = new Mock<HttpFileCollectionBase>();
  11. var file = new Mock<HttpPostedFileBase>();
  12. context.Setup(x => x.Request).Returns(request.Object);
  13.  
  14. files.Setup(x => x.Count).Returns(1);
  15.  
  16. // The required properties from my Controller side
  17. file.Setup(x => x.InputStream).Returns(_stream);
  18. file.Setup(x => x.ContentLength).Returns((int)_stream.Length);
  19. file.Setup(x => x.FileName).Returns(_stream.Name);
  20.  
  21. files.Setup(x => x.Get(0).InputStream).Returns(file.Object.InputStream);
  22. request.Setup(x => x.Files).Returns(files.Object);
  23. request.Setup(x => x.Files[0]).Returns(file.Object);
  24.  
  25. _controller.ControllerContext = new ControllerContext(
  26. context.Object,new RouteData(),_controller);
  27.  
  28. // The rest...
  29. }

希望这可以为您的解决方案提供一个想法:)

猜你在找的asp.Net相关文章