ruby - reciclados - como hacer un bolso de jeans viejos
Reutilizar los pasos de pepino (5)
Llamar a los pasos de las definiciones de pasos es una mala práctica y tiene algunas desventajas :
- Si el escenario falla y hay invocaciones de paso anidadas, obtendrá solo la última definición de paso invocado en el seguimiento de la pila. Puede ser difícil encontrar desde qué lugar se llamó ese último paso.
- Llamar a stepdef a veces es más difícil de encontrar y leer que el método ruby
- Los métodos de Ruby te dan más poder que llamar pasos desde pasos definidos
Aslak Hellesøy recommends extraer acciones populares a World lugar de reutilizar pasos. Aísla esas acciones en un solo lugar, hace que este código sea más fácil de encontrar. También puede extraer el código a las clases o módulos de Ruby habituales.
#/support/world_extensions.rb
module KnowsUser
def login
visit(''/login'')
fill_in(''User name'', with: user.name)
fill_in(''Password'', with: user.password)
click_button(''Log in'')
end
def user
@user ||= User.create!(:name => ''Aslak'', :password => ''xyz'')
end
end
World(KnowsUser)
#/step_definitions/authentication_steps.rb
When /^I login$/ do
login
end
Given /^a logged in user$/ do
login
end
Aquí hay una discusión útil sobre el tema en la lista de correo de Cucumber - link
Quiero reutilizar algunos pasos de Pepino, pero parece que no puedo encontrar el camino correcto.
Quiero escribir un paso como:
Given /^I login with (.*) credentials$/ |type|
# do stuff with type being one of "invalid" or "valid"
end
Pero luego da otro paso como:
Given /^I login successfully$
# call "Given I login with valid credentials"
end
Así que al probar la autenticación de usuario puedo usar el primero, pero en la mayoría de los otros lugares, puedo usar el último y no tener que reprogramar.
¿Hay alguna manera de llamar a ese otro paso, o simplemente pongo la lógica en un método auxiliar, y llamo a dicho método desde cada tarea (básicamente una refactorización de extracción de métodos, que después de leer mi pregunta me hace creer que es la mejor manera) de todas formas)?
Mejor ajuste sus pasos en% {} en lugar de comillas. Entonces, no necesita escapar las comillas dobles que necesitará usar con frecuencia:
Given /^I login successfully$
step %{I login with valid credentials}
end
Given /^I login with (.*) credentials$/ |type|
# do stuff with type being one of "invalid" or "valid"
end
Reutilice palabras clave en el archivo de características que proporcionará la reutilización del código.
NO se recomienda llamar a pasos defs dentro de los pasos definidos.
Escribiría mi archivo de características de esta manera,
Scenario Outline: To check login functionality
Given I login with "<username>" and "<password>"
Then I "<may or may not>" login successfully
Examples:
|username|password|may or may not|
|paul |123$ |may |
|dave |1111 |may not |
En mi definición de paso, (Esto es Java)
@Given(I login with /"([^/"]*)/" and /"([^/"]*)/"$)
public void I_login_with_and(String username, String password){
//login with username and password
}
@Then(I /"([^/"]*)/" login successfully$)
public void I_login_successully_if(String validity){
if(validity.equals("may")){
//assert for valid login
}
else
if(validity.equals("may not")){
//assert for invalid login
}
}
De esta manera, hay una gran cantidad de reutilización de código. Su mismo Given y luego maneja escenarios válidos y no válidos. Al mismo tiempo, su archivo de características tiene sentido para los lectores.
Tenga en cuenta que el método para llamar pasos en pasos ha cambiado en las versiones recientes de pepino, que verá si obtiene un error como "ADVERTENCIA: Usar ''Dado / Cuándo / Luego'' en las definiciones de paso está en desuso, use ''paso'' para llame a otros pasos: /path/to/step_definitions/foo_steps.rb: 631: in `block in ''". Vea la wiki de pepino para más detalles.
La esencia del cambio es que ahora debe usar los métodos de step
o steps
.
When /^I make all my stuff shiny$/
step "I polish my first thing"
end
When /^I make all my stuff shiny$/
steps %Q{
When I polish my first thing
When I shine my second thing
}
end
ACTUALIZACIÓN : el método descrito a continuación ha quedado obsoleto. La forma recomendada de llamar a un paso desde otro paso ahora se ve así:
Given /^I login successfully$/
step "I login with valid credentials"
end
Método antiguo, obsoleto (para referencia):
Puede llamar a los pasos de otros pasos como este:
Given /^I login successfully$/
Given "I login with valid credentials"
Then "I should be logged in"
end
Si todos los escenarios dentro de una característica requieren esto (u otros pasos), también puede agregar un Fondo a cada característica, con los pasos comunes, como sigue:
Background:
Given I log in with valid credentials
Scenario: Change my password
Given I am on the account page