- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的 AzureBlobRepository 编写单元测试。存储库在构造函数中接收一个 CloubBlobClient。我想模拟客户端,但这给出了一个异常(exception):
using (var mock = AutoMock.GetLoose())
{
var mockClient = mock.Mock<CloudBlobClient>();
}
Cannot choose between multiple constructors with equal length 2 on type 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient'. Select the constructor explicitly, with the UsingConstructor() configuration method, when the component is registered.
当然,在我的单元测试中我没有注册任何东西,所以这条消息不是很有帮助。
我还尝试了其他方法,例如提供 NameParameters、TypedParameters,或调用 mock.Create 代替 mock.Mock,但我尝试的所有方法都返回相同的异常消息。
(在CloudBlobContainer上也出现了同样的问题)
实现接口(interface)后更新这是我编写的单元测试示例:
[TestMethod]
public void AzureBlobRepository_GetByIdAsync_ReturnsContent()
{
Guid blobId = Guid.NewGuid();
Guid directoryName = Guid.NewGuid();
string containerName = "unittest";
using (var mock = AutoMock.GetLoose())
{
var mockClient = mock.Mock<ICloudBlobClient>();
var mockContainer = mock.Mock<ICloudBlobContainer>();
var mockDirectory = mock.Mock<ICloudBlobDirectory>();
// notice that we're not using AutoMock here, it fails to create the mock
var mockBlob = new Mock<CloudBlockBlob>(new Uri($"http://tempuri.org/{containerName}/{directoryName}/{blobId}"));
mockBlob.Setup(m => m.DownloadTextAsync()).Returns(Task.FromResult("content"));
mockClient.Setup(m => m.GetContainerReference(containerName))
.Returns(mockContainer.Object);
mockContainer.Setup(m => m.GetDirectoryReference(directoryName.ToString()))
.Returns(mockDirectory.Object);
mockDirectory.Setup(m => m.GetBlockBlobReference(blobId.ToString()))
.Returns(mockBlob.Object);
var repository = mock.Create<AzureBlobRepository>(
new TypedParameter(typeof(ICloudBlobClient), mockClient.Object),
new NamedParameter("container", containerName),
new NamedParameter("directory", directoryName));
var result = repository.GetByIdAsync(blobId, directoryName).Result;
result.ShouldBe("content");
}
}
最佳答案
这些类应被视为第 3 方实现问题。这意味着您无法控制它们,我们不应该 mock 我们无法控制的东西。它们应该封装在您可以控制的抽象之后,并且可以在单独测试时根据需要进行模拟。
public interface ICloudBlobClient {
//...expose only the functionality I need
}
public class CloudBlobClientWrapper : ICloudBlobClient {
private readonly CloudBlobClient client;
public CloudBlobClientWrapper(CloudBlobClient client) {
this.client = client;
}
//...implement interface wrapping
}
正是出于这个原因,类应该依赖于抽象而不是具体化。模拟具体类往往会产生链式 react
包装器不需要完全包装客户端,但可以聚合功能以免暴露实现问题。
所以现在当单独测试时你可以模拟你控制的抽象
using (var mock = AutoMock.GetLoose()) {
var mockClient = mock.Mock<ICloudBlobClient>();
/// ...and the rest of the test.
}
关于c# - 使用 AutoFac 和 AutoMock 模拟 CloudBlobClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45876042/
我最近一直在学习 Azure,发现有 2 个用于处理 blob 的类:CloudBlobClient 和 BlobClient。 CloudBlobClient 来自 Microsoft.Azure.
来自documentation函数 CloudBlobClient.StartCopyAsync() 它说 Initiates an asynchronous operation to start c
我有这两个对象用于 Azure Blob 存储访问,并希望在 ASP.NET MVC 应用程序中使用它们。 CloudBlobClient blobClient = storageAccount.Cr
我已经为此工作了几天,并阅读了之前有关多线程和 blob 客户端的问题并实现了他们的建议。 我已将问题归结为以下内容。 不会生成任何错误,只是没有将任何内容写入threadtest容器(已存在)。有时
我想将 CloudBlobContainer 实例“容器”依赖注入(inject)到我的自定义类中。 问题是生命周期。我可以为 Per Web Request 或 As a singleton 做,因
每次我想从存储中获取 blob 时,是否应该创建 CloudStorageAccount 和 CloudBlobClient 实例?例如,我实现了自定义虚拟路径提供程序来使用 blob 存储。最佳设计
我正在尝试为我的 AzureBlobRepository 编写单元测试。存储库在构造函数中接收一个 CloubBlobClient。我想模拟客户端,但这给出了一个异常(exception): usin
我正在构建的应用程序会在 azure 上下载和上传一些 block blob。我目前使用的是 v6.1,一切正常。但由于以下问题,我无法升级到 v7: 我可能完全错了,但我决定不在我的应用程序中使用
我正在开发一个 azure 的应用程序,它需要在某个时候上传(下载)大量的小 blob 到单个容器(超过 1k blob,每个小于 1 Mb)。为了加快这个过程,我想使用多个线程来上传(下载)blob
SSIS包 找不到方法:'Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient Microsoft.DataTransfer.Runtime.Azur
我是一名优秀的程序员,十分优秀!