javascript - test - toBe(verdadero) vs toBeTruthy() vs toBeTrue()
protractor tutorial (4)
Descargo de responsabilidad : esto es solo una suposición salvaje
Sé que todos adoran una lista fácil de leer:
-
toBe(<value>)- El valor devuelto es igual que<value> -
toBeTrue()- Comprueba si el valor devuelto estrue toBeTruthy()- Verifica si el valor, cuando se lanza a un booleano, será un valor verdaderoLos valores de Truthy son todos los valores que no son
0,''''(cadena vacía),false,null,NaN,undefinedo[](matriz vacía) *.* Tenga en cuenta que cuando ejecuta
!![], devuelvetrue, pero cuando ejecuta[] == falsetambién devuelvetrue. Depende de cómo se implemente. En otras palabras:(!![]) === ([] == false)
En su ejemplo, toBe(true) y toBeTrue() arrojarán los mismos resultados.
¿Cuál es la diferencia entre expect(something).toBe(true) , expect(something).toBeTruthy() y expect(something).toBeTrue() ?
Tenga en cuenta que toBeTrue() es un marcador personalizado introducido en jasmine-matchers entre otros jasmine-matchers útiles y útiles como toHaveMethod() o toBeArrayOfStrings() .
La pregunta está destinada a ser genérica, pero, como un ejemplo del mundo real, estoy probando que un elemento se muestra en protractor . ¿Qué marcador debería usar en este caso?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
En javascript hay trues y truthys. Cuando algo es verdadero, es obviamente cierto o falso. Cuando algo es verdad, puede o no ser un booleano, pero el valor "emitido" de es un booleano.
Ejemplos.
true == true; // (true) true
1 == true; // (true) truthy
"hello" == true; // (true) truthy
[1, 2, 3] == true; // (true) truthy
[] == false; // (true) truthy
false == false; // (true) true
0 == false; // (true) truthy
"" == false; // (true) truthy
undefined == false; // (true) truthy
null == false; // (true) truthy
Esto puede simplificar las cosas si desea verificar si una cadena está configurada o si una matriz tiene algún valor.
var users = [];
if(users) {
// this array is populated. do something with the array
}
var name = "";
if(!name) {
// you forgot to enter your name!
}
Y como se dijo. expect(something).toBe(true) y expect(something).toBeTrue() es lo mismo. Pero expect(something).toBeTruthy() no es lo mismo que cualquiera de esos.
Hay muchas respuestas buenas, solo quería agregar un escenario donde el uso de estas expectativas podría ser útil. Usando element.all(xxx) , si necesito verificar si todos los elementos se muestran en una sola ejecución, puedo realizar -
expect(element.all(xxx).isDisplayed()).toBeTruthy(); //Expectation passes
expect(element.all(xxx).isDisplayed()).toBe(true); //Expectation fails
expect(element.all(xxx).isDisplayed()).toBeTrue(); //Expectation fails
La razón es que .all() devuelve una matriz de valores, por lo que se pueden realizar todo tipo de expectativas ( getText , isPresent , etc ...) con toBeTruthy() cuando .all() entra en escena. Espero que esto ayude.
Lo que hago cuando me pregunto algo así como la pregunta que se hace aquí es ir a la fuente.
ser()
expect().toBe() se define como:
function toBe() {
return {
compare: function(actual, expected) {
return {
pass: actual === expected
};
}
};
}
Realiza su prueba con === que significa que cuando se usa como expect(foo).toBe(true) , pasará solo si foo realmente tiene el valor true . Los valores de Truthy no harán que pase la prueba.
toBeTruthy ()
expect().toBeTruthy() se define como:
function toBeTruthy() {
return {
compare: function(actual) {
return {
pass: !!actual
};
}
};
}
Tipo de coacción
Un valor es verdad si la coacción de este valor a un valor booleano da el valor true . La operación !! prueba la veracidad al obligar al valor pasado a expect a un valor booleano. Tenga en cuenta que, contrariamente a lo que implies respuesta actualmente aceptada, == true no es una prueba correcta de la veracidad. Obtendrás cosas graciosas como
> "hello" == true
false
> "" == true
false
> [] == true
false
> [1, 2, 3] == true
false
Considerando que usando !! rendimientos:
> !!"hello"
true
> !!""
false
> !![1, 2, 3]
true
> !![]
true
(Sí, vacío o no, una matriz es verdad).
a decir verdad()
expect().toBeTrue() es parte de jasmine-matchers (que está registrada en npm como jasmine-expect luego de que un proyecto posterior registrara primero jasmine-matchers ).
expect().toBeTrue() se define como:
function toBeTrue(actual) {
return actual === true ||
is(actual, ''Boolean'') &&
actual.valueOf();
}
La diferencia con expect().toBeTrue() y expect().toBe(true) es que expect().toBeTrue() prueba si se trata de un objeto Boolean . expect(new Boolean(true)).toBe(true) fallaría mientras que expect(new Boolean(true)).toBeTrue() pasaría. Esto es por esta cosa graciosa:
> new Boolean(true) === true
false
> new Boolean(true) === false
false
Al menos es verdad
> !!new Boolean(true)
true
¿Cuál es el más adecuado para usar con elem.isDisplayed() ?
En última instancia, Transportador entrega esta solicitud al Selenio. La documentation indica que el valor producido por .isDisplayed() es una promesa que se resuelve en boolean . Lo tomaría al valor nominal y .toBeTrue() o .toBe(true) . Si encuentro un caso en el que la implementación devuelva los valores de truthy / falsy, presentaría un informe de error.