不受支持的表达式:不可覆盖的成员(此处:)不得用于设置/验证表达式
Unsupported expression: Non-overridable members (here: ) may not be used in setup / verification expressions
我正在使用 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")));
第 mockBlobServiceProvider.Setup(repo => repo.GetBlockBlobContainer("sample")).Returns(new CloudBloblContainer(new Uri("http://mytest")));
行给我这个错误:
System.NotSupportedException: 'Unsupported expression: repo => repo.GetBlockBlobContainer("sample")
Non-overridable members (here: BlobServiceProvider.GetBlockBlobContainer) may not be used in setup / verification expressions.'
Class BlobServiceProvider
:
Public Class BlobServiceProvider
{
public CloudBlobContainer GetBlockBlobContainer(string containerName)
{
CloudBlobContainer Container = blobClient.GetContainerReference(containerName);
Container.CreateIfNotExistsAsync();
return Container;
}
}
我该如何解决这个问题?
moq
使用 dynamic proxy 围绕模拟类型创建包装器,以便能够拦截调用并更改被调用方法的行为。
代理是如何构建的?
- 如果你模拟
interface
代理只是接口的一个实现
- 如果您有
class
代理覆盖 class
问题:你能模拟 sealed class
或非 virtual
(abstract
) 方法吗?
你猜,没有。无法使用动态代理围绕它创建包装器。 moq
本身提示一样,如果你看错误:
Non-overridable members (here:
BlobServiceProvider.GetBlockBlobContainer) may not be used in setup
要回答您的问题,您需要从提供程序中提取 interface
并模拟它,或者将该方法标记为虚拟方法。就个人而言,我确实更喜欢带有 interface
的选项,但它可能需要一些重构和 DI。
我正在使用 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")));
第 mockBlobServiceProvider.Setup(repo => repo.GetBlockBlobContainer("sample")).Returns(new CloudBloblContainer(new Uri("http://mytest")));
行给我这个错误:
System.NotSupportedException: 'Unsupported expression: repo => repo.GetBlockBlobContainer("sample")
Non-overridable members (here: BlobServiceProvider.GetBlockBlobContainer) may not be used in setup / verification expressions.'
Class BlobServiceProvider
:
Public Class BlobServiceProvider
{
public CloudBlobContainer GetBlockBlobContainer(string containerName)
{
CloudBlobContainer Container = blobClient.GetContainerReference(containerName);
Container.CreateIfNotExistsAsync();
return Container;
}
}
我该如何解决这个问题?
moq
使用 dynamic proxy 围绕模拟类型创建包装器,以便能够拦截调用并更改被调用方法的行为。
代理是如何构建的?
- 如果你模拟
interface
代理只是接口的一个实现 - 如果您有
class
代理覆盖 class
问题:你能模拟 sealed class
或非 virtual
(abstract
) 方法吗?
你猜,没有。无法使用动态代理围绕它创建包装器。 moq
本身提示一样,如果你看错误:
Non-overridable members (here: BlobServiceProvider.GetBlockBlobContainer) may not be used in setup
要回答您的问题,您需要从提供程序中提取 interface
并模拟它,或者将该方法标记为虚拟方法。就个人而言,我确实更喜欢带有 interface
的选项,但它可能需要一些重构和 DI。