2013-02-18 37 views
1

比方說,我有一個對象具有創建另一個對象作爲其操作的一部分的函數。我應該如何監視一個在另一個對象內調用的構造函數?

sinon = require('sinon') 
chai = require 'chai' 
sinonChai = require("sinon-chai") 
chai.use(sinonChai) 
chai.should() 
Paper = {} 
Paper.Origami = require('../assets/src/coffee/origami.coffee').Paper.Origami 

describe '#throwOrigami', -> 
    it 'should create origami and throw it', -> 
    m = new Monkey() 
    throwSpy = sinon.spy(m, 'throwOrigami') 
    createSpy = sinon.spy(Paper, 'Origami')  
    # next function creates origami, then 'throws' it at someone 
    m.throwOrigami(); 
    createSpy.should.have.been.calledWithNew 
    throwSpy.should.have.been.calledOnce 

猴類在Paper.Origami頂部有一個要求。

如果我在測試中創建一個摺紙,但我不能通過,如果我將它留給Monkey對象內部的創建。我懷疑這是因爲兩個對象之間的需求路徑不同 - 也許節點不會將它們視爲同一個對象。

問題:我可以讓sinon間諜窺探Monkey對象內發生的Origami對象的創建嗎?

回答

1

require在查看緩存之前解決了路徑問題,因此路徑不同也無關緊要。但是,您在測試中使用Origami屬性創建了一個新的Paper對象。因此,當您在Paper, 'Origami'上進行偵察時,您的測試文件中本地創建的Paper對象的屬性Origami被替換爲間諜。我想你可以做,而不是執行以下操作:

Paper = require('../assets/src/coffee/origami.coffee').Paper 

如果現在改變Paper對象,這將是與您的Monkey模塊中使用。但是,我建議使用類似proxyquire的東西來間諜或嘲笑依賴。