あなたのメソッドgetParticipants
は多くのことを行っています..実際には3つのことなので、私はむしろ1つのことだけに焦点を当てようとします:ビルドしMyappp.Collections.UsersCollection
ます。そして、以前に必要だったすべての計算を別のメソッドに移動します。
そして、あなたは非常にトリッキーなものに集中することができます:呼び出しをモックすることnew
。
私は3つのフェーズでそれを行います:
1.ユーザーフィルターを別の場所に移動します
のメソッドに移動することをお勧めします。そうすれば、次のようにインスタンスMyapp.Collections.ParticipationsCollection
から呼び出すことができます。Event
Myapp.Models.Event =
Backbone.Model.extend({
getParticipants: function(){
var usersArray = this.get("participations").getUsers();
var participants = new Myapp.Collections.UsersCollection(usersArray);
return participants;
}
});
Myapp.Collections.ParticipationsCollection =
Backbone.Collection.extend({
getUsers: function(){
var users =
this.map(function(participation){
return participation.get("user");
});
return users;
}
});
このようにして、メソッドを簡単にモックしgetUsers
て、ターゲットメソッドをテストできます。
2.さらに多くのユーザー配列をラッピングして取得
上記のコード例では、まだ複雑なチェーンメソッド呼び出しがあり、this.get("participations").getUsers()
これをカスタムメソッドに移動することもできます。これも簡単にモックできます。
次のように終了します。
Myapp.Models.Event =
Backbone.Model.extend({
getParticipants: function(){
var usersArray = this.getUsersArray();
var participants = new Myapp.Collections.UsersCollection( usersArray );
return participants;
},
getUsersArray: function(){
return this.get("participations").getUsers();
}
});
3.コレクションの初期化をテストします
ここで、コレクションのモックに焦点を当て、Myapp.Collections.UsersCollection
このコレクションの初期化とエンティティのメソッドが適切なパラメータを使用していることを確認する必要があります。
適切なパラメータはメソッドの結果であり、これEvent.getUsersArray()
で簡単にモックできます。
Sinonは、メソッドが.で呼び出されたかどうかを確認することを特に期待していnew
ます。
これに対する私のJasmine/Sinonのアプローチは、メソッドが新しいコレクションを返すことをテストしていないため、実際には正確ではありません。誰かがより良い実装を提供できることを願っています。
describe("Event", function() {
beforeEach(function(){
testModel = new Myapp.Models.Event();
});
it("getParticipants returns proper Collection", function() {
var usersCollectionSpy = sinon.spy( Myapp.Collections, "UsersCollection" );
var getUsersArrayMock = sinon.stub(testModel, "getUsersArray");
getUsersArrayMock.returns( "usersArray" );
testModel.getParticipants();
expect( usersCollectionSpy.calledWith( "usersArray" ) ).toBeTruthy();
expect( usersCollectionSpy.calledWithNew() ).toBeTruthy();
});
});
jsFiddleを確認してください