que tendría que utilizar expect ... change
para verificar que un particular cambia de llamadas a métodos - o no cambia - algún otro valor. En este caso:
expect { click_button "Create my account" }.not_to change(User, :count)
hará que rspec para hacer lo siguiente:
- Run
User.count
y tenga en cuenta el valor devuelto. (Esto se puede especificar como un receptor y un nombre de método, como (User, :count)
en su ejemplo, o como un bloque arbitraria de código, como { User.count }
.
- Run
click_button "Create my account"
que es un método Carpincho que simula un clic del ratón sobre un enlace. ..
- Run
User.count
nuevo
- comparar los resultados de # 1 y # 3 Si son diferentes, el ejemplo falla si son la misma, pasa
Otras formas de utilizar expect ... change
:..
expect { thing.destroy }.to change(Thing, :count).from(1).to(0)
expect { thing.tax = 5 }.to change { thing.total_price }.by(5)
expect { thing.save! }.to raise_error
expect { thing.symbolize_name }.to change { thing.name }.from(String).to(Symbol)
Algunos documentos son here.
¿Cómo se hace esto es un poco arcano, y no es en absoluto necesario entender cómo funciona el fin de usarlo. Una llamada al expect
está definiendo una estructura para ejecutar rspec, usando la DSL personalizada de rspec y el sistema de "emparejamiento". Gary Bernhardt tiene una bien clara screencast en la que argumenta que el misterio de rspec en realidad cae naturalmente de un lenguaje dinámico como el rubí.No es una buena introducción a usando rspec, pero si tiene curiosidad sobre cómo funciona, puede que le resulte interesante.
ACTUALIZACIÓN
Después de ver su comentario en otra respuesta, voy a añadir un poco sobre el orden de las operaciones. El truco no intuitivo es que es el matcher (change
en este caso) que ejecuta todos los bloques. expect
tiene una lambda, not_to
es un alias para should_not
cuyo trabajo es pasar la lambda al emparejador. El emparejador en este caso es change
que sabe ejecutar su propio argumento una vez, luego ejecuta el lambda que se pasó (el de expect
), luego ejecuta su propio argumento nuevamente para ver si las cosas han cambiado. Es complicado porque la línea parece que debería ejecutarse de izquierda a derecha, pero como la mayoría de las piezas solo están pasando por bloques de código, pueden mezclarlas y barajarlas en el orden que tenga más sentido para el emparejador.
No soy un experto en las partes internas de rspec, pero esa es mi comprensión de la idea básica.
Esto no es Capibara, es RSpec. –
@RyanBigg Gracias, solo lo corrigió. – Bedasso