2013-03-10 8 views
46

テスト中の動作に沿って拡張される可能性のあるオブジェクトがありますが、元のプロパティがまだ存在することを確認します。プロパティのサブセット上のオブジェクトを比較するジャスミンマッチャーがありますか?

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

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

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

私はの線に沿って、この場合には通過するマッチャーを持っているしたいと思います:

expect(result).toInclude(example) 

私は、カスタム照合を書くことができることを知っているが、それはように私には思えますこれは既に解決策が出ているべきであるという共通の問題です。どこを探したらいいですか?

答えて

84

ジャスミン2.0

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

をこの修正ので:それもネストされたオブジェクト上で動作https://github.com/pivotal/jasmine/commit/47884032ad255e8e15144dcd3545c3267795dee0 を、あなただけのそれぞれは、あなたがjasmine.objectContaining()

に部分的に一致させたいオブジェクトをラップする必要があります

簡易例:

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

...まだ本当にありません:) – iwein

+0

を異なる値や類似のキーを含むオブジェクトに対して同じことをする方法はありますか? – Siva

+3

@Siva - あなたのオブジェクトの代わりに 'Object.keys(obj)'の結果を直接比較しようとする可能性がありますか? –

1

私はそれが一般的ではないと思います。あなたがそれを見つけることはできないと思います。ただ、1を書き:

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

は、私は同じことをやったが、それはSOの答えは、より良い現実を反映するために変更したときに、私はそれを愛する – iwein

5

私は同じ問題を抱えていました。私はこのコードを試してみました、それは私の作品:

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

これは、値が一致しない場合にtrueを返すので、問題にはあまり関係しません。 – KnownColor

関連する問題