假设我有一个对象,它有一个函数可以创建另一个对象作为其操作的一部分。
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
对象的创建?
答案 0 :(得分:1)
require
在查看其缓存之前解析路径,因此路径不同并不重要。但是,您在测试中创建了一个具有Paper
属性的新Origami
对象。因此,当您监视Paper, 'Origami'
时,它是您在测试文件中本地创建的Origami
对象的属性Paper
,该对象将替换为间谍。我想你可以做以下事情:
Paper = require('../assets/src/coffee/origami.coffee').Paper
如果您现在更改了Paper
对象,它将与您在Monkey
模块中使用的对象相同。但是,我建议使用类似proxyquire的内容来监视或模拟依赖项。