Dot-Net

不支持的表達式:不可覆蓋的成員(此處:)不得用於設置/驗證表達式

  • July 12, 2019

我正在使用 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: ‘不支持的表達式:repo => repo.GetBlockBlobContainer(“sample”)

不可覆蓋的成員(此處:BlobServiceProvider.GetBlockBlobContainer)不得用於設置/驗證表達式。

BlobServiceProvider

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

我該如何解決這個問題?

**moq**使用動態代理圍繞模擬類型創建包裝器,以便能夠攔截呼叫並更改被呼叫方法的行為。

代理是如何建構的?

  • 如果你模擬interface代理只是介面的一個實現
  • 如果你有class代理是類的覆蓋

問題:你能模擬sealed class或非virtual( abstract) 方法嗎?

你猜,沒有。無法使用動態代理圍繞它創建包裝器。**moq**如果您查看錯誤,它本身暗示相同:

不可覆蓋的成員(此處為:BlobServiceProvider.GetBlockBlobContainer)不能在設置中使用


要回答您的問題,您需要interface從提供程序中提取並模擬它,或者將該方法標記為虛擬。就個人而言,我確實更喜歡選項,interface但它可能需要一些重構和 DI。

引用自:https://stackoverflow.com/questions/57001556