texto poner indexadores dev como c# unit-testing moq indexer

c# - indexadores - como poner texto en dev c++



Usando Moq para establecer indexadores en C# (3)

Estoy teniendo problemas para averiguar cómo configurar los indexers en C # con Moq. La documentación de Moq es débil, y he hecho mucha búsqueda ... lo que me gustaría hacer es similar en la solución a cómo Moq establecer una propiedad indexada :

var someClass = new Mock<ISomeClass>(); someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);

Quiero modificar lo anterior para que funcione con cualquier índice y cualquier valor, así que puedo hacer algo como esto:

someClass.Object.SomeIndexedProperty[1] = 5;

Actualmente tengo lo siguiente, que funciona muy bien para el captador de propiedades indexadas, pero si alguna vez establezco el valor, Moq lo ignora:

var someValues = new int[] { 10, 20, 30, 40 }; var someClass = new Mock<ISomeClass>(); someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()]) .Returns<int>(index => someValues[index]); // Moq doesn''t set the value below, so the Assert fails! someClass.Object.SomeIndexedProperty[3] = 25; Assert.AreEqual(25, someClass.Object.SomeIndexedProperty[3]);


En su prueba, sus únicas expectativas establecidas para el que obtiene el indexador - y esto siempre devolverá el valor correspondiente de su matriz. El indexador no se comporta como una cosa real. Puedes intentar algunas cosas para arreglarlo:

  1. Puede verificar si puede tachar este indexador. Personalmente estoy usando RhinoMocks, así que no tengo idea si esto está implementado

    someClass.SetupProperty(f => f.SomeIndexedProperty);

  2. Puedes intentar burlarte también del configurador y hacer que cambie la matriz subyacente. Mi primera suposición sería intentar algo en este sentido (sin garantía de que funcionará):

    someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()] = It.IsAny<int>()) .Callback((index, value) => someValues[index] = value);

  3. O si la interfaz de ISomeClass es lo suficientemente pequeña, usted podría crear una implementación de apéndice (que tendría implementado el indexador como un diccionario, matriz, etc.)


Encontré una solución a mi problema. Requiere un cambio en mi forma de pensar ... He estado buscando utilizar Assert de NUnit para verificar que el configurador de indizadores en mi simulación de someClass estaba siendo llamado con el valor correcto.

Parece que con Moq la forma compatible de hacerlo es usar la función VerifySet . Un ejemplo artificial:

someClass.Object.SomeIndexedProperty[3] = 25; someClass.VerifySet(mock => mock.SomeIndexedProperty[3] = 25);

La prueba de la unidad pasa ya que SomeIndexedProperty[3] se establece en 25, pero de lo contrario fallaría.


Utilizando Moq 3.1.416.3

La configuración no funcionará para los indexadores (porque toma una expresión que significa que se descartan las instrucciones de asignación)

por lo que necesita utilizar SetupSet como

_settingsStore.SetupSet(store => store["MruNotes"] = It.IsAny<string>()) .Callback<string,string>( (key, value) => persistedValue = value);

Una pequeña advertencia: esta expresión solo coincide si la clave es "MruNotes". No pude usar un matcher como It.IsAny para la clave.