2016-12-19 5 views
3

sinon matcherで結果の配列をどのように一致させることができますか?オブジェクトの配列をsinon.jsとどのように一致させるか?

たとえば、このコードはどのように機能しますか?

var mystub = sinon.stub(); 
var myarg = { val: 1, mylist: [ {a:1}, {b:2}, {c:3,d:4} ] }; 

mystub(myarg); 

sinon.assert.calledOnce(mystub).withArgs(
    sinon.match({val: 1, mylist: [{a:1},{b:2},{c:3,d:4}]}) // this doesn't work 
); 

これを動作させるにはどうすればよいですか? (私のテストでは、myargにアクセスできないので、それに合わせる必要があります)。

明らかに、私はカスタム関数マッチャーを書くことができましたが、私は読んだり書いたりする方が簡単です。

答えて

2

カスタムマッチャー。

独自のカスタムsinon matcherを書くことをおすすめします。

一般的で使いやすい方法で書くことができます。ここで

は、例のアプローチです:

// usage 
...withArgs(sinon.match(deepMatch({ 
    val: 1, 
    mylist: [{a:1}, {b:2}, {c:3,d:4}] 
}))); 


// custom matcher 
const deepMatch = (expectation) => (actual) => { 
    return Object.keys(expectation).every(key => { 
     if (checkIfItsObject(expectation[key])) { 
      // value is also an object, go deeper and then compare etc. 
     } else { 
      // compare and return boolean value accordingly 
     } 
    }); 
}; 

// note: checkIfItsObject is pseudocode - there are many ways to 
// check if an object is an object so I did not want to complicate 
// this code example here 
+1

おかげで、それは私がやってしまったものです。このように思えるのは、一般的な必要性です。私はそれがsinonの一部ではないことに驚いています。 –

関連する問題