recorrer objetos objects elemento ejemplos buscar array javascript testing jasmine promise protractor

javascript - objetos - Esperar elemento en matriz



javascript indexof array of objects (3)

La solución alternativa es usar .toMatch() matcher con expresiones regulares y específicamente un carácter especial | (llamado "o" ), que permite hacer coincidir solo una entrada para tener éxito:

expect(page.errorMessage.getText()).toMatch(/Unknown Error|Connection Error/);

Una de mis pruebas espera que el texto de un mensaje de error sea uno de múltiples valores. Dado que getText() devuelve una promesa que no puedo usar para toContain() jasmine matcher. Lo siguiente no funcionaría ya que el protractor ( jasminewd under-the-hood) no resolvería una promesa en la segunda parte del emparejador, toContain() en este caso:

expect(["Unknown Error", "Connection Error"]).toContain(page.errorMessage.getText());

Pregunta: ¿Hay alguna manera de verificar si un elemento está en una matriz con jazmín + transportador donde un elemento es una promesa?

En otras palabras, estoy buscando el inverso de toContain() para que expect() implícitamente resuelva la promesa pasada.

Como solución alternativa, puedo resolver explícitamente la promesa con then() :

page.errorMessage.getText().then(function (text) { expect(["Unknown Error", "Connection Error"]).toContain(text); });

No estoy seguro si esta es la mejor opción. También estaría bien con una solución basada en terceros como jasmine-matchers .

Como ejemplo, este tipo de afirmación existe en Python:

self.assertIn(1, [1, 2, 3, 4])


Para mí, la solución que identificó es la mejor solución. Sin embargo, no debemos olvidar que se trata de una ejecución asincrónica y es posible que desee considerar el soporte asíncrono de Jasmine .

Entonces, su prueba se verá como la siguiente:

it(''should check item is in array'', function(done){ //Note the argument for callback // do your stuff/prerequisites for the spec here page.errorMessage.getText().then(function (text) { expect(["Unknown Error", "Connection Error"]).toContain(text); done(); // Spec is done! }); });

Nota: Si no pasa este argumento done a la spec callback la spec callback , se ejecutará hasta su finalización sin fallas, pero no se informarán las afirmaciones en los resultados de ejecución para esa especificación (en otras palabras, esa especificación tendrá 0 aserciones) y podría llevar a confusiones.


Parece que necesitas un marcador personalizado. Según la versión de Jasmine, estás usando:

Con Jasmine 1:

this.addMatchers({ toBeIn: function(expected) { var possibilities = Array.isArray(expected) ? expected : [expected]; return possibilities.indexOf(this.actual) > -1; } });


Con Jasmine 2:

this.addMatchers({ toBeIn: function(util, customEqualityTesters) { return { compare: function(actual, expected) { var possibilities = Array.isArray(expected) ? expected : [expected]; var passed = possibilities.indexOf(actual) > -1; return { pass: passed, message: ''Expected ['' + possibilities.join('', '') + '']'' + (passed ? '' not'' : '''') + '' to contain '' + actual }; } }; } });


Tendrás que ejecutar esto en la sección beforeEach en cada uno de tus bloques de describe que se va a usar.

Su expectativa se vería así:

expect(page.errorMessage.getText()).toBeIn(["Unknown Error", "Connection Error"]);