我想测试以下代码行:
...
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/