Dot-Net
不支持的表達式:不可覆蓋的成員(此處:)不得用於設置/驗證表達式
我正在使用 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。
