微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想测试以下代码行:
...
Bitmap uploadedPicture = Bitmap.FromStream(model.Picture.InputStream) as Bitmap;
...

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

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

完全没问题.

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

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://www.jb51.cc/aspnet/250612.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐