¿Hay un comparador de jazmín para comparar objetos en subconjuntos de sus propiedades?

84

Tengo un objeto que puede extenderse a lo largo de mi comportamiento bajo prueba, pero quiero asegurarme de que las propiedades originales todavía estén allí.

var example = {'foo':'bar', 'bar':'baz'}

var result = extendingPipeline(example)
// {'foo':'bar', 'bar':'baz', 'extension': Function}

expect(result).toEqual(example) //fails miserably

Me gustaría tener un comparador que pase en este caso, en la línea de:

expect(result).toInclude(example)

Sé que puedo escribir un comparador personalizado, pero me parece que este es un problema tan común que ya debería haber una solución. ¿Dónde debo buscarlo?

iwein
fuente
Tuve un problema similar al intentar comparar matrices, por lo que no pude usar directamente jasmine.objectContaining que no maneja la matriz como se describe en otra respuesta, al final solo usé array.map en el resultado esperado para obtener un objeto que coincida con el ejemplo, dejando esto aquí para su consideración como alternativa.
Brandon Søren Culley

Respuestas:

145

Jazmín 2.0

expect(result).toEqual(jasmine.objectContaining(example))

Desde esta solución: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 incluso funciona en objetos anidados, solo necesita envolver cada objeto que desea hacer coincidir parcialmente enjasmine.objectContaining()

Ejemplo simple:

it('can match nested partial objects', function ()
{
    var joc = jasmine.objectContaining;
    expect({ 
        a: {x: 1, y: 2}, 
        b: 'hi' 
    }).toEqual(joc({
        a: joc({ x: 1})
    }));
});
Kamil Szot
fuente
¿Hay alguna forma de hacer lo mismo para un objeto que contiene diferentes valores y claves similares?
Siva
3
@Siva - ¿Quizás podrías intentar comparar los resultados en Object.keys(obj)lugar de tus objetos directamente?
Kamil Szot
11

Tuve el mismo problema. Acabo de probar este código, funciona para mí:

expect(Object.keys(myObject)).toContain('myKey');
Chicna
fuente
3
Esto no resuelve la pregunta, ya que devolverá verdadero si los valores no coinciden.
KnownColor
2

No creo que sea tan común y no creo que puedas encontrar uno. Solo escribe uno:

beforeEach(function () {
    this.addMatchers({
        toInclude: function (expected) {
            var failed;

            for (var i in expected) {
                if (expected.hasOwnProperty(i) && !this.actual.hasOwnProperty(i)) {
                    failed = [i, expected[i]];
                    break;
                }
            }

            if (undefined !== failed) {
                this.message = function() {
                    return 'Failed asserting that array includes element "'
                        + failed[0] + ' => ' + failed[1] + '"';
                };
                return false;
            }

            return true;
        }
    });
});
Wouter J
fuente
1

Pensé que ofrecería una alternativa utilizando un mapa de JavaScript moderno y un operador de descanso. Podemos omitir propiedades usando desestructuración con operador de reposo. Consulte una descripción más detallada en este artículo .

var example = {'foo':'bar', 'bar':'baz'}

var { extension, ...rest } = extendingPipeline(example)

expect(rest).toEqual(example)
Brandon Søren Culley
fuente