为单元测试创​​建HttpPostedFileBase的实例

时间:2014-06-02 13:59:18

标签: c# .net asp.net-mvc-4 unit-testing

我需要创建一个HttpPostedFileBase类对象的实例并将其传递给方法,但我找不到任何方法来实例化它。我正在创建一个测试用例来测试我的fileupload方法。

这是我的方法,它采用HttpPostedFileBase个对象。我需要从我的测试用例类中调用它。我没有使用任何模拟库。

有一种简单的方法吗?

[HttpPost]
public JsonResult AddVariation(HttpPostedFileBase file, string name, string comment, string description, decimal amount, string accountLineTypeID)
{
    var accountLineType = _fileService.GetAccountLineType(AccountLineType.Debit);
    if (Guid.Parse(accountLineTypeID) == _fileService.GetAccountLineType(AccountLineType.Credit).AccountLineTypeID)
    {
        amount = 0 - amount;
    }
    var info = new File()
    {
        FileID = Guid.NewGuid(),
        Name = name,
        Description = description,
        FileName = file.FileName,
        BuildID = Guid.Parse(SelectedBuildID),
        MimeType = file.ContentType,
        CreatedUserID = CurrentUser.UserID,
        UpdatedUserID = CurrentUser.UserID,
        Amount = amount,
    };
    var cmmnt = new Comment()
    {
        CommentDate = DateTime.Now,
        CommentText = comment,
        FileID = info.FileID,
        UserID = CurrentUser.UserID
    };
    _variationService.AddVariation(info, file.InputStream);
    _variationService.AddComment(cmmnt);
    return Json("Variation Added Sucessfully", JsonRequestBehavior.AllowGet);
}

2 个答案:

答案 0 :(得分:18)

HttpPostedFileBase是一个抽象类,因此无法直接实例化。

创建一个派生自HttpPostedFileBase的类,并返回您要查找的值。

    class MyTestPostedFileBase : HttpPostedFileBase
{
Stream stream;
string contentType;
string fileName;

public MyTestPostedFileBase(Stream stream, string contentType, string fileName)
{
    this.stream = stream;
    this.contentType = contentType;
    this.fileName = fileName;
}

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

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

public override string FileName
{
    get { return fileName; }
}

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

public override void SaveAs(string filename)
{
    throw new NotImplementedException();
}
}

答案 1 :(得分:0)

我认为@BenjaminPaul是最好的答案-但想添加此内容,以防其他人想要测试MyTestPostedFileBase对象的内容长度。

如上所述,我创建了该类,然后传递了一个填充有随机字节的流-这允许MyTestPostedFileBase.ContentLength返回我需要的可测试值。

byte[] byteBuffer = new Byte[10];
Random rnd = new Random();
rnd.NextBytes(byteBuffer);
System.IO.MemoryStream testStream = new System.IO.MemoryStream(byteBuffer);

然后实例化它:

var TestImageFile = new MyTestPostedFileBase(testStream, "test/content", "test-file.png");