beforeEach(function() { this.addMatchers({ toExactlyMatch: function(expected) { var a1, a2, l, i, key, actual = this.actual; var getKeys = function(o) { var a = []; for(key in o) { if(o.hasOwnProperty(key)) { a.push(key); } } return a; } a1 = getKeys(actual); a2 = getKeys(expected); l = a1.length; if(l !== a2.length) { return false; } for(i = 0; i < l; i++) { key = a1[i]; expect(key).toEqual(a2[i]); expect(actual[key]).toEqual(expected[key]); } return true; } }) });