asp.net-mvc - 模拟 HttpPostedFileBase 和 InputStream 进行单元测试

标签 asp.net-mvc unit-testing moq httppostedfilebase

我想测试以下代码行:

...
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...
    }

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

关于asp.net-mvc - 模拟 HttpPostedFileBase 和 InputStream 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15622153/

相关文章:

c# - 围绕现有实例使用 Moq 创建 Mock?

javascript - 如何使用列值和行值突出显示/着色表 td?

html - 更改复选框位置

C#-错误 : Collection is read-only

asp.net-mvc - 如何同时使用 Twitter Bootstrap、MVC 和 Visual Studio?

unit-testing - 如何将 MockWebServer 用于 webclient 的 Junit 测试用例?

ruby-on-rails - Mock Sequel 连接到 Oracle 数据库

c# - 需要 TDD 方法的想法

c# - 为通用类型创建 Moq 实例

android - 我想运行特定构建类型的单元测试和espresso测试用例