Pregunta

Tengo el siguiente método de firma en mi iterface:

void SetItem(ref AddressItem item);

hago una restricción de parámetros como esto:

IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = null;
form.SetItem(Arg.Is(item));

Pero eso falla debido a que el árbitro. Si tomo el árbitro cabo entonces funciona bien. Pero necesito pasar por referencia aquí.

Alguna idea de cómo conseguir esto?

Nota al pie: Mi objetivo final es lanzar una excepción en el caso de SetItem aprobada en valor es nulo. Si usted puede ayudar con eso, entonces obtendrá puntos adicionales!

¿Fue útil?

Solución

NSubstitute no tiene apoyo directo a los parámetros de coincidencia árbitro arg, pero en general funciona bien con ellos.

Me voy a asumir que usted tiene que utilizar ref como se indica en su pregunta, pero es evidente que si se puede evitar ref su API será más simple, como la voluntad para ello, (independientemente de los marcos que se use).

En respuesta a su pregunta inmediata, puede pasar una referencia mediante la actualización de su segundo ejemplo de código a:

form.SetItem(ref item);

Para su nota lateral, asegúrese de que usted no está tratando de empujar demasiado el comportamiento en su sustituto. Me he dado cuenta que cada vez que hago esto es una necesidad señal que para simplificar la comunicación entre la clase que estoy probando y sus dependencias. (O si realmente necesito una gran cantidad de lógica en un objeto falso, Entregaré código de una vez de generarlo;. A menudo puede ser más simple)

Hay algunas maneras de conseguir este llamado a lanzar una excepción:

form.When(x => x.SetItem(ref item)).Do(x => { throw new ArgumentNullException(); });

Esto producirá una excepción cuando se accede con una referencia nula. También puede agregar selectivamente este comportamiento en función del argumento pasado, aunque le advierto que esto ya que es probablemente una señal de que está empujando demasiado en su sustituto.

form.WhenForAnyArgs(x => x.SetItem(ref item))
    .Do(x => {
        if (x[0] == null)
            throw new ArgumentNullException();
    });

Por último, si lo que desea es comprobar que la clase que se está probando responde correctamente cuando se produce una excepción IAddAddressForm arg nula, probablemente me acaba de hacer esto:

form
    .WhenForAnyArgs(x => x.SetItem(ref item))
    .Do(x => { throw new ArgumentNullException(); });

De esa manera usted no me importa lo que el argumento es, lo que desea es asegurarse de que el código que está probando reacciona a este caso correctamente.

Espero que esto ayude.

Nota al margen:

Si desea utilizar una matcher arg (como Arg.Any<AddressItem>()) para un argumento out o ref tendrá que definirlo fuera de la propia llamada (esto puede ser un error poco propensa: que necesita para asegurarse de que usted define los comparadores en el mismo orden en que van a ir a la llamada):

        IAddAddressForm form = Substitute.For<IAddAddressForm>();
        AddressItem item = Arg.Is<AddressItem>(y => y.Number == 14);
        form
            .When(x => x.SetItem(ref item))
            .Do(x => { throw new ArgumentNullException(); });
        var address = new AddressItem { Number = 14 };
        form.SetItem(ref address);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top