0

私はバックボーンとジャスミンで作業しており、モデルが保存されたときに「sync」メソッドの callCount をテストしようとしています。いくつかの奇妙な理由で、done 変数が true になった後でも、同期ハンドラーは同期を処理し続けます (これは、テストを停止する予定でした)。 .

ここに私のスペックがあります:

describe('Model :: User', function() {

  var mockData = { name: 'Foo Bar' };

  beforeEach(function() {
    var that = this,
        done = false;

    require(['app/namespace','app/models/UserModel','app/collections/UsersCollection'], function(namespace, UserModel ,UsersCollection) {
        that.users = new UsersCollection();
        that.user = new UserModel();
         done = true;
    });

    waitsFor(function() {
      return done;
    }, "Create Models");




  });

  afterEach(function(){
    var done = false,
        isDone = function(){ return done; };

    this.users.fetch({
      success: function(c) {
        console.log('after the test calling destory of collection...')
        c.each(function(m){
          m.destroy();
        });
        done = true;
      }
    });

    waitsFor(isDone);

    done = false;
    this.user.destroy({
      success: function(){
        console.log('after the test calling destory of model...')
        done = true;
      }
    });

    waitsFor(isDone);

  });

  describe('.save()', function() {
    it('should call sync when saving', function() {
      var done = false,
          spy = jasmine.createSpy();
      this.user.on('sync', spy);
      this.user.on('sync', function(){

        console.log('checking spy.callCount-'+spy.callCount);
    //------------------------------------------------
        if(!done)//why i need this if ?!
            expect(spy.callCount).toEqual(1);
        done = true;

      }, this);

      this.user.save(mockData);


      waitsFor(function() { return done; });

    });

  });


});

テストは、expect ステートメントの前に「if(!done)」条件を追加した場合にのみ正しく機能します。それ以外の場合は、テスト後に破棄によって引き起こされた同期呼び出しをカウントし続けます...ありがとう転送

4

1 に答える 1

1

このテストにはいくつかの問題があります。まず第一に、syncモデルを保存するときにイベントが発生することをテストする必要はありません。これは、別のフレームワークによって提供されているためです。

次に、SinonJsの偽のサーバーを使用して、非同期呼び出しを台無しにしないようにする必要があります。sinon を使用すると、リクエストはすぐに呼び出されます。つまり、必要はありません。また、コールバックのアサーションは少し奇妙に思えます。waitsFor

this.server = sinon.fakeServer.create();
server.respondWith({data: 'someData'})
server.autoRespond = true; //so when the request start the fake server will immediately call the success callback
var spy = jasmine.createSpy();
this.user.on('sync', spy);
this.user.save(mockData);
expect(spy.callCount).toEqual(1);
于 2013-05-09T13:28:08.267 に答える