Estoy usando xUnit y Moq para escribir casos de prueba. Estoy usando el código a continuación para crear un simulacro, pero obtengo el problema resaltado.
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"))); La línea mockBlobServiceProvider.Setup(repo => repo.GetBlockBlobContainer("sample")).Returns(new CloudBloblContainer(new Uri("http://mytest"))); me esta dando este error:
System.NotSupportedException: 'Expresión no admitida: repo => repo.GetBlockBlobContainer("muestra")
Los miembros no reemplazables (aquí: BlobServiceProvider.GetBlockBlobContainer) no se pueden usar en expresiones de configuración/verificación.'
Clase BlobServiceProvider :
Public Class BlobServiceProvider { public CloudBlobContainer GetBlockBlobContainer(string containerName) { CloudBlobContainer Container = blobClient.GetContainerReference(containerName); Container.CreateIfNotExistsAsync(); return Container; } }¿Cómo puedo resolver este problema?
El moq usa un proxy dinámico para crear un envoltorio alrededor del tipo simulado para poder interceptar llamadas y cambiar el comportamiento de los métodos invocados.
¿Cómo se construye el proxy?
interface simulada es solo una implementación de la interfazclass el proxy anula la clase Pregunta: ¿Podría simular una sealed class o un método no virtual ( abstract )?
Adivinas, no. No hay forma de crear un envoltorio a su alrededor usando un proxy dinámico. moq en sí mismo sugiere lo mismo, si observa el error:
Los miembros no reemplazables (aquí: BlobServiceProvider.GetBlockBlobContainer) no se pueden usar en la configuración
Para responder a su pregunta, debe extraer la interface de su proveedor y simularla o marcar el método como virtual. Personalmente, prefiero la opción con la interface , pero podría requerir alguna refactorización y DI.