Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Asignar dentro de un test falla si es que le preguntamos a algo declarado en el fixture #1223

Closed
sanuzzi opened this issue Aug 20, 2017 · 2 comments

Comments

@sanuzzi
Copy link

sanuzzi commented Aug 20, 2017

Tengo algo así para el fixture:

	const enfermo
	const unDoctorCualquiera
	
	fixture {
		...
		unDoctorCualquiera = new Doctor()
	}

Y tengo un test así:

	test "si un doctor cura a un enfermo, la calidad del doctor aumenta" {
		const calidadInicial = unDoctorCualquiera.calidad()
		unDoctorCualquiera.cura(enfermo)
		const calidadFinal = unDoctorCualquiera.calidad()
		
		assert.that(calidadFinal > calidadInicial)
	}

El test falla y dice: "Cannot send message calidad() to null" en la línea donde empieza el cuerpo del test.

En cambio, haciendo esto sí lo entiende y el test da verde:

	test "un doctor inicialmente tiene calidad cero" {
		assert.equals(unDoctorCualquiera.calidad(), 0)
	}

Y por las dudas, comento que eso mismo usando (innecesariamente) una referencia, también falla:

	test "un doctor inicialmente tiene calidad cero" {
		const calidad = unDoctorCualquiera.calidad()
		assert.equals(calidad, 0)
	}

Pareciera que se hace lío cuando se asigna a una referencia algo que viene de un fixture.

Leí otros issues donde había problemas al poder asignar más de una vez algo a una constante o demás problemas en fixtures, no sé si estará englobado en un mismo problema de fondo.

Probado en Windows 10 x64, con versión de Wollok 1.6.2

@sanuzzi sanuzzi changed the title Asignar dentro de un test falla si es que le preguntamos algo declarado en el fixture Asignar dentro de un test falla si es que le preguntamos a algo declarado en el fixture Aug 20, 2017
@lspigariol
Copy link
Contributor

Sí, es muy extraño

estuve probando variantes y sólo sucede en ese caso:
cuando se asigna a una const (o var) local de un test en la misma línea de la declaración, el retorno de un objeto instanciado en el fixture.

no sucede cuando

  • la const (o var) es del describe
  • es un var y se asigna en la linea siguiente
  • si se instancia en la seccion de inicializacion del describe.

tambien vi:
si la referencia al objeto en la seccion de inicializacion se le asigna otro valor, al correr el testo en vez de null tiene dicho valor y da el mensaje de error de DNU

Mas allá del error, el lugar recomendado para inicializar las variables o constantes es en la seccion de inicializacion, reservando el fixture solo para enviar mensajes o tareas mas complejas.

@fdodino
Copy link
Collaborator

fdodino commented Sep 15, 2017

Je, ahí entendí por qué pasa.
Cuando corremos un test,

  1. primero inicializo el estado "global" del test, que si está dentro de un describe constituyen todas las variables que define ese describe. Si uno define la variable con un valor, no habrá problema.
  2. luego se evalúan los miembros del describe (métodos por ejemplo)
  3. y luego se evalúan las variables locales. El problema es que si vos definís en la misma línea el valor llamando a una variable del describe, todavía no está inicializada (debería haber corrido el fixture pero todavía no lo había hecho). Por eso falla.

Fíjense que este describe corre perfecto:

class Enfermo {}

class Doctor {
	var calidad = 0
	method calidad() = calidad
	method calidad(_calidad) { calidad = _calidad }
	method cura(alguien) { calidad = calidad + 1 }	
}

describe "issue 1223" {
	var unDoctorCualquiera
	var enfermo
	
	fixture {
		enfermo = new Enfermo()
		unDoctorCualquiera = new Doctor()
		unDoctorCualquiera.calidad(2)
	}
	
	test "si un doctor cura a un enfermo, la calidad del doctor aumenta" {
		var calidadInicial
		calidadInicial = unDoctorCualquiera.calidad()
		unDoctorCualquiera.cura(enfermo)
		var calidadFinal
		calidadFinal = unDoctorCualquiera.calidad()
		assert.that(calidadFinal > calidadInicial)
	}
	
}

Ahora me fijo de arreglarlo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants