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

Monkey 类在顶部有一个 require Paper.Origami

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

问题:我可以让sinon间谍监视Origami对象内部发生的Monkey对象的创建吗?

4

1 回答 1

1

require在查看其缓存之前解析路径,因此路径不同并不重要。但是,您在测试中创建了一个Paper具有Origami属性的新对象。因此,当您监视 时Paper, 'Origami',它是您在测试文件中本地创建OrigamiPaper对象的属性,它被替换为 spy. 我想您可以改为执行以下操作:

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

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

于 2013-05-25T08:04:39.590 回答