我应该如何监视在另一个对象内部调用的构造函数?

时间:2013-02-18 18:30:53

标签: node.js testing coffeescript sinon

假设我有一个对象,它有一个函数可以创建另一个对象作为其操作的一部分。

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

Monkey类在Paper.Origami的顶部有一个要求。

如果我在测试中创建了一个Origami,我可以通过这个测试,但如果我把它留给Monkey对象的内部创建它就不会通过。我怀疑这是因为两个对象之间的需求路径不同 - 可能节点不会将它们视为同一个对象。

问题:我是否可以让sinon间谍监视Origami对象中发生的Monkey对象的创建?

1 个答案:

答案 0 :(得分:1)

require在查看其缓存之前解析路径,因此路径不同并不重要。但是,您在测试中创建了一个具有Paper属性的新Origami对象。因此,当您监视Paper, 'Origami'时,它是您在测试文件中本地创建的Origami对象的属性Paper,该对象将替换为间谍。我想你可以做以下事情:

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

如果您现在更改了Paper对象,它将与您在Monkey模块中使用的对象相同。但是,我建议使用类似proxyquire的内容来监视或模拟依赖项。