2009-08-16 12 views
9

Tengo problemas para verificar los parámetros de tipo Ienumerable/Array al configurar la expectativa de que los métodos invoquen mis objetos simulados. Creo que ya que coincide con diferentes referencias, no lo considera una coincidencia. Solo quiero que coincida con el contenido de la matriz, a veces ni siquiera me importa el orden.Parámetros Moq Match y Verificar Matriz/IEnumerable en la configuración del método

mockDataWriter.Setup(m => m.UpdateFiles(new string[]{"file2.txt","file1.txt"})); 

Idealmente, quiero algo que funciona como el siguiente, probablemente podría escribir un método de extensión para hacer esto.

It.Contains(new string[]{"file2.txt","file1.txt"}) 

It.ContainsInOrder(new string[]{"file2.txt","file1.txt"}) 

La única construida en forma de que pueda coincidir con éstos en este momento es con la función de predicado, pero parece que este problema es bastante común que debe ser construido en.

¿Hay una construida en la forma para que coincida estos tipos, o la biblioteca de extensión que puedo usar. Si no, solo escribiré un método de extensión o algo así.

Gracias

+1

A ver si esta pregunta/respuesta ayuda en absoluto: http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq –

Respuesta

7

tenido que implementar algunos comparadores personalizados, no han encontrado ninguna otra construida en forma de lograr esto en la versión 3. Se utiliza http://code.google.com/p/moq/wiki/QuickStart como un recurso.

public T[] MatchCollection<T>(T[] expectation) 
{ 
    return Match.Create<T[]>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 

public IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 


public void MyTest() 
{ 

... 

mockDataWriter.Setup(m => m.UpdateFiles(MatchCollection(new string[]{"file2.txt","file1.txt"}))); 

... 


} 
+0

Tenga en cuenta que esto solo comprueba si todos los valores esperados están en la colección de entrada, y no al revés. InputCollection aún puede contener elementos que no están a la expectativa. –

3

No necesita dos métodos distintos para la matriz y IEnumerable:

private static IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => expectation.All(inputCollection.Contains)); 
} 
4

respuesta anterior por Oleg no maneja caso en inputCollection tiene elementos que no están en expectation.

Por ejemplo:

MatchCollection(new [] { 1, 2, 3, 4 }) 

coincidirá con inputCollection { 1, 2, 3, 4, 5 } cuando claramente no debería.

Aquí está la matcher completa:

public static IEnumerable<T> CollectionMatcher<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create((IEnumerable<T> inputCollection) => 
         !expectation.Except(inputCollection).Any() && 
         !inputCollection.Except(expectation).Any()); 
} 
+0

Gracias, por manejar el caso especial. – saxos

Cuestiones relacionadas