【问题标题】:Mocking a CloudBlockBlob and have it return a stream模拟 CloudBlockBlob 并让它返回一个流
【发布时间】:2019-07-30 12:43:19
【问题描述】:

我正在尝试最小化一个 Azure CloudBlockBlob 并让它返回一个 Stream 以便我可以测试我的 BlobStorage 存储库是否正确处理输出。

但不知何故,返回的流总是空的。

单元测试代码:

//....

var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write("sample data");
writer.Flush();
stream.Position = 0;

var blobMock = new Mock<CloudBlockBlob>(new Uri("http://tempuri.org/blob"));
blobMock
    .Setup(m => m.ExistsAsync())
    .ReturnsAsync(true);
blobMock
    .Setup(m => m.DownloadToStreamAsync(It.IsAny<MemoryStream>()))
    .Returns(Task.FromResult(stream));

//....

存储库代码:

//....

var blob = GetContainer(container).GetBlockBlobReference(name);
if (await blob.ExistsAsync())
{
    var ms = new MemoryStream();
    await blob.DownloadToStreamAsync(ms);
    ms.Seek(0, SeekOrigin.Begin);
    return ms;
}

//....

所以我返回的 MemoryStream ms 始终是一个空流,而不是我在 Moq Returns() 方法中使用的 stream 对象。

如何让该 blob 返回我的示例流?

【问题讨论】:

  • 这是两个不同的流。获取在模拟参数中传递的流并复制测试流。
  • 那不是DownloadToStreamAsync 将我的样本流复制到ms 吗?
  • 不,不是。而且该方法还返回一个普通的任务。不是流本身

标签: c# asp.net-core azure-storage moq


【解决方案1】:

这是两个不同的流。在Callback 中获取在模拟参数中传递的流并复制测试流。

例如

//....
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write("sample data");
writer.Flush();
stream.Position = 0;

var blobMock = new Mock<CloudBlockBlob>(new Uri("http://tempuri.org/blob"));
blobMock
    .Setup(m => m.ExistsAsync())
    .ReturnsAsync(true);
blobMock
    .Setup(m => m.DownloadToStreamAsync(It.IsAny<Stream>()))
    .Callback((Stream target) => stream.CopyTo(target)) //<---Something like this
    .Returns(Task.CompletedTask);
//....

模拟实际上并不返回流。假设作用于流,这就是为什么需要回调来复制预期行为的原因。

注意

复制从当前流中的当前位置开始,复制操作完成后不会重置目标流的位置。

所以在这种情况下,如果打算从目标读取,您可能需要重置它

//...

.Callback((Stream target) => {
    stream.CopyTo(target);
    target.Position = 0;
})

//...

【讨论】:

  • tnx,确实有效!猜猜我有一些关于起订量的阅读工作
  • 我收到异常 ....无效的回调。设置带有参数的方法(Stream、AccessCondition、FileRequestOptions、OperationContext)不能调用带有参数的回调(Stream)。就我而言,我在嘲笑 CloudFile
  • 错过给回调方法添加其他参数..stackoverflow.com/questions/61498758/…
猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 2012-04-19
  • 2019-08-18
  • 2019-11-25
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多