2012-07-17 18 views
9

Estoy escribiendo pruebas de unidad usando Moq. He creado un objeto simulado. Ahora, cuando intento burlarme de su propiedad, obtengo el error "Un árbol de expresiones no puede contener una propiedad indexada"Mocking indexed property

aquí está mi código.

public Node GetNode(IMyInterface interface, string itemName) 
{ 
    return interface.Items[itemName]; 
} 

Aquí está la prueba de la unidad

var expected = new Node(); 
var itemName = "TestName"; 
var mock = new Mock<IMyInterface>(); 
mock.Setup(f => f.Items[itemName]).Returns(expected); 
var target = new MyClass(); 

var actual = target.GetNode(mock.Object, itemName); 
Assert.AreEqual(expected, actual); 

Esta línea es que me da error.

mock.Setup(f => f.Items[itemName]).Returns(expected); 

¿Cómo puedo cambiar esta función?

+0

Eso no es un problema moq. Los árboles de expresiones no pueden contener propiedades indexadas como indica el error. Debería refactorizar su código para acceder al elemento de la lista sin recurrir a los índices. –

+0

no puedo cambiar "interface.Items [itemName];" porque lo estoy recibiendo a través de COM, cualquier forma de hacer esto en la prueba, –

+0

¿Qué es exactamente los artículos? ¿Puedes proporcionar la definición de interfaz completa? –

Respuesta

12

interfaz era un objeto COM y había obtener la función, así que en vez de acceder directamente a la propiedad mediante el uso de funciones se indexador,

mock.Setup(f => f.get_Items(itemName)).Returns(expected); 
+0

¿Has probado 'mock.Setup (f => f [itemName]). Devuelve (esperado);'? No estoy seguro de si funciona en su situación (COM) (¿Qué versiones de C# y .NET?), Pero se ve mucho mejor. –