Gibt es einen Jasmin-Matcher, um Objekte in Teilmengen ihrer Eigenschaften zu vergleichen?

84

Ich habe ein Objekt, das möglicherweise entlang meines zu testenden Verhaltens erweitert wird, möchte jedoch sicherstellen, dass die ursprünglichen Eigenschaften noch vorhanden sind.

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

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

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

Ich hätte gerne einen Matcher, der in diesem Fall wie folgt passt:

expect(result).toInclude(example)

Ich weiß, dass ich einen benutzerdefinierten Matcher schreiben kann, aber es scheint mir, dass dies ein so häufiges Problem ist, dass es bereits eine Lösung geben sollte. Wo soll ich danach suchen?

iwein
quelle
Ich hatte ein ähnliches Problem beim Versuch, Arrays zu vergleichen, sodass ich jasmine.objectContaining nicht direkt verwenden konnte, das das Array nicht wie in einer anderen Antwort beschrieben behandelt. Am Ende habe ich nur array.map für das erwartete Ergebnis verwendet, um ein Objekt zu erhalten, das mit dem übereinstimmt Beispiel: Lassen Sie dies hier als Alternative zur Prüfung.
Brandon Søren Culley

Antworten:

145

Jasmin 2.0

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

Da dieses Update: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 sogar für verschachtelte Objekte funktioniert, müssen Sie nur jedes Objekt einschließen, in das Sie teilweise passen möchtenjasmine.objectContaining()

Einfaches Beispiel:

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
quelle
Gibt es eine Möglichkeit, dasselbe für ein Objekt zu tun, das unterschiedliche Werte und ähnliche Schlüssel enthält?
Siva
3
@Siva - Vielleicht könnten Sie versuchen, die Ergebnisse von Object.keys(obj)anstelle Ihrer Objekte direkt zu vergleichen ?
Kamil Szot
11

Ich hatte das gleiche Problem. Ich habe gerade diesen Code ausprobiert, er funktioniert für mich:

expect(Object.keys(myObject)).toContain('myKey');
Chicna
quelle
3
Dies beantwortet die Frage nicht ganz, da sie true zurückgibt, wenn die Werte nicht übereinstimmen.
KnownColor
2

Ich denke nicht, dass es so häufig ist und ich glaube nicht, dass Sie eines finden können. Schreiben Sie einfach eine:

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.
quelle
1

Ich dachte, ich würde eine Alternative mit modernen Javascript-Karten und Ruheoperatoren anbieten. Wir können Eigenschaften durch Destrukturierung mit Rest Operator weglassen. Siehe weitere Beschreibung in diesem Artikel .

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

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

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