wake-up-neo.com

Gibt es einen Jasmin-Matcher zum Vergleichen von Objekten in Teilmengen ihrer Eigenschaften?

Ich habe ein Objekt, das möglicherweise mit meinem getesteten Verhalten erweitert wird, aber ich möchte 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 passen würde.

expect(result).toInclude(example)

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

59
iwein

Jasmin 2.0

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

Seit diesem Fix: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 Es funktioniert sogar bei verschachtelten Objekten. Sie müssen jedes Objekt, das Sie abgleichen möchten, nur teilweise in jasmine.objectContaining() einschließen.

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})
    }));
});
106
Kamil Szot

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

expect(Object.keys(myObject)).toContain('myKey');
7
Chicna

Ich glaube nicht, dass es so üblich ist, und ich glaube nicht, dass Sie einen finden können. Schreiben Sie einfach eins:

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;
        }
    });
});
1
Wouter J

Ich dachte, dass ich eine Alternative mit moderner Javascript-Karte und Rest-Operator anbieten würde. Wir können Eigenschaften durch Destructuring mit Restoperator weglassen. Weitere Beschreibung in diesem Artikel

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

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

expect(rest).toEqual(example)