2015-11-20 32 views
0

看來sinon.spy(object, method)沒有像預期的那樣包裝我的對象#方法。sinon spy在異步回調中沒有包裝方法

(我有我看到了同樣的問題,因爲描述herehere一種不安的感覺,但我不明白爲什麼這應該是我打電話sinon.spy(...)之前已經實例化我的對象,而據我所知我」米不使用任何緩存對象)

下面是完整的測試文件:

var 
AmbitParser = require('../lib/parsers/ambit-parser'), 
expect = require('chai').expect, 
sinon = require('sinon'); 

describe('AmbitParser', function() { 
    var ambit_parser = new AmbitParser(); 

    describe('#extractLineItems()', function() { 

     it('calls extractLineItems once', function(done) { 
      var spy = sinon.spy(ambit_parser, 'extractLineItems'); 

      ambit_parser.parseBills(function gotBills(err, bills) { 
       expect(ambit_parser.extractLineItems.callCount).to.equal(1); // => expected undefined to equal 1 
       expect(spy.callCount).to.equal(1);       // => expected 0 to equal 1 
       done(); 
      }); 

      ambit_parser.extractLineItems.restore(); 
     });      // calls extractLineItems once 
    });       // #extractLineItems 
});        // AmbitParser 

在「預期不確定等於1」至expect(ambit_parser.extractLineItems.callCount).to.equal(1);結果的電話,如果我改變,要expect(spy.callCount).to.equal(1);,我得到'預計0到equa 1'。

在一起,這讓我認爲對sinon.spy(...)的調用沒有按預期包裝ambit_parser.extractLineItems方法,但我不明白爲什麼會出現這種情況。

回答

0

問題是調用restore()的位置:它不應該在測試函數的主體中。相反,將它放在after()區塊中。

發生了什麼事情是因爲restore()方法在測試開始後立即被調用,所以到執行回調的時候,spied upon方法已經恢復,所以sinon會報告方法從未調用。

以下修改原來的代碼將如預期:

describe('AmbitParser', function() { 
    var ambit_parser = new AmbitParser(); 

    describe('#extractLineItems()', function() { 

     before(function() { 
      sinon.spy(ambit_parser, 'extractLineItems'); 
     }); 
     after(function() { 
      ambit_parser.extractLineItems.restore(); 
     }); 

     it('calls extractLineItems once', function(done) { 
      ambit_parser.parseBills(function gotBills(err, bills) { 
       expect(ambit_parser.extractLineItems.callCount).to.equal(1); 
       done(); 
      }); 
     });      // calls extractLineItems once 
    });       // #extractLineItems 
});        // AmbitParser 

這個故事的寓意:請確保調用任何回調都完成後才reset()