2013-03-10 5 views
46

Ich habe ein Objekt, das entlang meines Verhaltens im Test erweitert werden kann, aber ich möchte sicherstellen, dass die ursprünglichen Eigenschaften noch da sind.Gibt es einen Jasmin-Matcher, um Objekte auf Teilmengen ihrer Eigenschaften zu vergleichen

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

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

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

Ich mag einen Matcher haben, die in diesem Fall entlang der Linien passieren würden:

expect(result).toInclude(example) 

Ich weiß, dass ich einen benutzerdefinierten Matcher schreiben kann, aber es scheint mir, dass Das ist so ein häufiges Problem, dass eine Lösung schon da draußen sein sollte. Wo soll ich danach suchen?

Antwort

84

Jasmin 2,0

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

Seit diesem Update: https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 es auch an verschachtelten Objekten funktioniert, brauchen Sie nur wickeln jedes Objekt teilweise in jasmine.objectContaining()

übereinstimmen soll

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}) 
    })); 
}); 
+7

ich liebe es, wenn SO Antworten ändern, um eine bessere Realität zu reflektieren :) – iwein

+0

Gibt es eine Möglichkeit, dasselbe für ein Objekt zu tun, das verschiedene Werte und ähnliche Schlüssel enthält? – Siva

+3

@Siva - Vielleicht könnten Sie versuchen, Ergebnisse von 'Object.keys (obj)' anstelle von Ihren Objekten direkt zu vergleichen? –

1

Ich glaube nicht, dass es so verbreitet ist und ich glaube nicht, dass Sie einen finden können. Nur einen schreiben:

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; 
     } 
    }); 
}); 
+0

Ich habe das gleiche getan, aber es ist nicht wirklich da noch ... – iwein

5

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

expect(Object.keys(myObject)).toContain('myKey'); 
+3

Dies beantwortet die Frage nicht ganz, da es wahr zurückgibt, wenn die Werte nicht übereinstimmen. – KnownColor

Verwandte Themen