Czy istnieje element dopasowujący jaśmin do porównywania obiektów w podzbiorach ich właściwości

84

Mam obiekt, który można rozszerzyć wzdłuż testowanego zachowania, ale chcę się upewnić, że oryginalne właściwości nadal istnieją.

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

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

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

Chciałbym mieć dopasowanie, które przejdzie w tym przypadku w następujący sposób:

expect(result).toInclude(example)

Wiem, że mogę napisać niestandardowego dopasowania, ale wydaje mi się, że jest to tak powszechny problem, że rozwiązanie powinno już istnieć. Gdzie mam tego szukać?

iwein
źródło
Miałem podobny problem, próbując porównać tablice, więc nie mogłem bezpośrednio użyć jasmine.object Zawierający, który nie obsługuje tablicy, jak opisano w innej odpowiedzi, w końcu po prostu użyłem array.map na oczekiwanym wyniku, aby uzyskać obiekt pasujący do przykład, pozostawiając to tutaj do rozważenia jako alternatywę.
Brandon Søren Culley

Odpowiedzi:

145

Jasmine 2.0

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

Ponieważ ta poprawka: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 działa nawet na obiektach zagnieżdżonych, wystarczy owinąć każdy obiekt, który chcesz częściowo dopasowaćjasmine.objectContaining()

Prosty przykład:

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
źródło
Czy istnieje sposób, aby zrobić to samo dla obiektu zawierającego różne wartości i podobne klucze?
Siva,
3
@Siva - Może mógłbyś spróbować bezpośrednio porównać wyniki Object.keys(obj)zamiast swoich obiektów?
Kamil Szot
11

Miałem ten sam problem. Właśnie wypróbowałem ten kod, działa dla mnie:

expect(Object.keys(myObject)).toContain('myKey');
Chicna
źródło
3
To nie do końca odpowiada na pytanie, ponieważ zwróci prawdę, jeśli wartości nie będą zgodne.
KnownColor
2

Nie sądzę, żeby to było takie powszechne i nie sądzę, żebyś mógł znaleźć. Po prostu napisz:

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.
źródło
1

Pomyślałem, że zaproponowałbym alternatywę przy użyciu nowoczesnej mapy javascript i operatora rest. Jesteśmy w stanie pominąć właściwości za pomocą destrukturyzacji z operatorem rest. Zobacz dalszy opis w tym artykule .

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

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

expect(rest).toEqual(example)
Brandon Søren Culley
źródło