1

Eventというバックボーンモデルのジャスミン単体テストがあります。

このモデルには、次の関数があります。

getParticipants: function(){
  new Myappp.Collections.UsersCollection(
    this.get("participations").map(function(participation){
      return participation.get("user");
    });
  );
}

4つの依存関係があります。

  • ユーザーモデル
  • ユーザーコレクション
  • 参加モデル
  • 参加コレクション

ベストプラクティスであるため、すべてのモデルを個別にテストしたいのですが、方法がわかりません。

モックとスタブにsinon.jsを使用していますが、この状況で正しく使用する方法がわかりません。

ありがとう!

4

1 に答える 1

4

あなたのメソッド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を確認してください

于 2012-05-28T19:43:47.597 に答える