不支持的表达式:不可覆盖的成员(此处:)不能用于设置/验证表达式

cha*_*har 14 .net moq xunit .net-core

我正在使用 xUnit 和 Moq 来编写测试用例。我正在使用下面的代码创建一个 Mock,但遇到了突出显示的问题。

下面粘贴了代码和错误的图片

CloudBlockBlob source = null;
AccessCondition sourceAccessCondition = null;
AccessCondition destAccessCondition = null;
BlobRequestOptions options = null;
OperationContext operationContext = null;
CloudBlobContainer container = new CloudBlobContainer(uri);
Task task = null;
DeleteSnapshotOption deleteSnapshotOption = new DeleteSnapshotOption();

var mockCloudBlobClient = new Mock<Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient>();
mockCloudBlobClient.Setup(repo => repo.GetContainerReference("sample")).Returns(container);

var mockCloudBlobContainer = new Mock<Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer>(uri);
mockCloudBlobContainer.Setup(repo => repo.GetBlockBlobReference("sample")).Returns(new CloudBlockBlob(uri));

var mockBlobServiceProvider = new Mock<BlobServiceProvider>();
mockBlobServiceProvider.Setup(repo => repo.GetBlockBlobContainer("sample")).Returns(new CloudBloblContainer(new Uri("http://mytest")));
Run Code Online (Sandbox Code Playgroud)

该行mockBlobServiceProvider.Setup(repo => repo.GetBlockBlobContainer("sample")).Returns(new CloudBloblContainer(new Uri("http://mytest")));给了我这个错误:

System.NotSupportedException: '不支持的表达式:repo => repo.GetBlockBlobContainer("sample")

不可覆盖的成员(此处:BlobServiceProvider.GetBlockBlobContainer)不得用于设置/验证表达式。

班级BlobServiceProvider

Public Class BlobServiceProvider
{
    public CloudBlobContainer GetBlockBlobContainer(string containerName)
    {
        CloudBlobContainer Container = blobClient.GetContainerReference(containerName);
        Container.CreateIfNotExistsAsync();
        return Container;
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Joh*_*nny 25

moq使用动态代理围绕模拟类型创建包装器,以便能够拦截调用并更改调用方法的行为。

代理是如何构建的?

  • 如果你模拟interface代理只是接口的一个实现
  • 如果您有class代理是该类的覆盖

问题:你可以模拟sealed class或非virtual( abstract) 方法吗?

你猜,不。无法使用动态代理围绕它创建包装器。moq本身提示相同,如果您查看错误:

不可覆盖的成员(此处:BlobServiceProvider.GetBlockBlobContainer)不能在设置中使用


要回答您的问题,您需要interface从提供程序中提取并模拟它或将该方法标记为虚拟。就个人而言,我确实更喜欢 选项,interface但它可能需要一些重构和 DI。