如何构建HttpPostedFileBase?

时间:2010-08-06 22:35:03

标签: c# asp.net-mvc asp.net-mvc-2 file-upload

我必须为这个方法编写一个单元测试但是我无法构造HttpPostedFileBase ...当我从浏览器运行该方法时,它运行良好,但我真的需要一个自动单元测试。所以我的问题是:我如何构造HttpPosterFileBase以便将文件传递给HttpPostedFileBase。

感谢。

    public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> files)
    {
        foreach (var file in files)
        {
           // ...
        }
    }

2 个答案:

答案 0 :(得分:6)

做这样的事情怎么样:

public class MockHttpPostedFileBase : HttpPostedFileBase
{
    public MockHttpPostedFileBase()
    {

    }
}

然后你可以创建一个新的:

MockHttpPostedFileBase mockFile = new MockHttpPostedFileBase();

答案 1 :(得分:2)

就我而言,我通过asp.net MVC web界面和RPC webservice以及unittest使用核心注册核心。在这种情况下,为HttpPostedFileBase定义自定义包装器很有用:

public class HttpPostedFileStreamWrapper : HttpPostedFileBase
{
    string _contentType;
    string _filename;
    Stream _inputStream;

    public HttpPostedFileStreamWrapper(Stream inputStream, string contentType = null, string filename = null)
    {
        _inputStream = inputStream;
        _contentType = contentType;
        _filename = filename;
    }

    public override int ContentLength { get { return (int)_inputStream.Length; } }

    public override string ContentType { get { return _contentType; } }

    /// <summary>
    ///  Summary:
    ///     Gets the fully qualified name of the file on the client.
    ///  Returns:
    ///      The name of the file on the client, which includes the directory path. 
    /// </summary>     
    public override string FileName { get { return _filename; } }

    public override Stream InputStream { get { return _inputStream; } }


    public override void SaveAs(string filename)
    {
        using (var stream = File.OpenWrite(filename))
        {
            InputStream.CopyTo(stream);
        }
    }