Visite el sitio web de NSubstitute para obtener más información.
NSubstitute está diseñado como un sustituto amigable de las bibliotecas simuladas de .NET.
Es un intento de satisfacer nuestro anhelo de una biblioteca burlona con una sintaxis sucinta que nos ayude a mantener el foco en la intención de nuestras pruebas, en lugar de en la configuración de nuestros dobles de prueba. Hemos intentado hacer que las operaciones requeridas con más frecuencia sean obvias y fáciles de usar, manteniendo escenarios menos habituales detectables y accesibles, y manteniendo al mismo tiempo el lenguaje más natural posible.
Perfecto para quienes son nuevos en las pruebas y para otros a quienes simplemente les gustaría escribir sus pruebas con menos ruido y menos lambdas.
Si tiene preguntas, solicitudes de funciones o comentarios sobre NSubstitute, plantee un problema en el sitio de nuestro proyecto. Todas las preguntas son bienvenidas a través de nuestro sitio de proyectos, pero para preguntas de estilo "cómo hacer", también puede probar StackOverflow con la etiqueta [nsubstitute], que a menudo conduce a muy buenas respuestas de la comunidad de programación en general. StackOverflow es especialmente útil si su pregunta también se relaciona con otras bibliotecas con las que nuestro equipo quizás no esté tan familiarizado (por ejemplo, NSubstitute con Entity Framework).
Digamos que tenemos una interfaz de calculadora básica:
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}
Podemos pedirle a NSubstitute que cree una instancia sustituta para este tipo. Podríamos pedir un trozo, una simulación, una falsificación, un espionaje, un doble de prueba, etc., pero ¿por qué molestarnos cuando sólo queremos sustituir una instancia sobre la que tenemos cierto control?
_calculator = Substitute . For < ICalculator > ( ) ;
virtual
de clases. Tenga cuidado al sustituir clases con miembros no virtuales. Consulte Crear un sustituto para obtener más información.
Ahora podemos decirle a nuestro sustituto que devuelva un valor para una llamada:
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;
Podemos comprobar que nuestro sustituto recibió una llamada, y no recibió otras:
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;
Si nuestra aserción de Recibido() falla, NSubstitute intenta brindarnos ayuda sobre cuál podría ser el problema:
NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
Add(1, 2)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
Add(1, *5*)
Add(*4*, *7*)
También podemos trabajar con propiedades usando la sintaxis de Returns que usamos para los métodos, o simplemente seguir con los antiguos establecedores de propiedades (para propiedades de lectura/escritura):
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
NSubstitute admite la coincidencia de argumentos para establecer valores de retorno y afirmar que se recibió una llamada:
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;
Podemos usar la coincidencia de argumentos y pasar una función a Returns() para obtener más comportamiento de nuestro sustituto (posiblemente demasiado, pero esa es tu decisión):
_calculator
. Add ( Arg . Any < int > ( ) , Arg . Any < int > ( ) )
. Returns ( x => ( int ) x [ 0 ] + ( int ) x [ 1 ] ) ;
Assert . That ( _calculator . Add ( 5 , 10 ) , Is . EqualTo ( 15 ) ) ;
También se puede llamar a Returns() con múltiples argumentos para configurar una secuencia de valores de retorno.
_calculator . Mode . Returns ( "HEX" , "DEC" , "BIN" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "BIN" ) ) ;
Finalmente, podemos generar eventos en nuestros sustitutos (desafortunadamente, C# restringe drásticamente el grado en que se puede limpiar esta sintaxis):
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ;
NSubstitute y sus pruebas se pueden compilar y ejecutar utilizando Visual Studio, Visual Studio Code o cualquier otro editor compatible con .NET. Tenga en cuenta que algunas pruebas están marcadas como [Pending]
y no están destinadas a aprobarse en este momento, por lo que es una buena idea excluir las pruebas en la categoría Pendiente de las ejecuciones de prueba.
También hay scripts de compilación en el directorio ./build
para compilaciones de línea de comandos y configuraciones de CI en la raíz del proyecto.
Para realizar compilaciones completas también necesitarás Ruby, ya que la gema jekyll se utiliza para generar el sitio web.
@fluffy-spoon/substitute
en NPM)