假设我有一个对象,它有一个函数,可以创建另一个对象作为其操作的一部分。
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.calledOnceMonkey类在顶部有一个对Paper.Origami的要求。
如果我在测试中创建了一个折纸,我可以让这个测试通过,但是如果我把它留给Monkey对象内部的create,它就不会通过。我怀疑这是因为两个对象之间的请求路径不同--可能node将它们视为不同的对象。
问:我能否让sinon间谍监视在Monkey对象内部创建的Origami对象?
发布于 2013-05-25 16:04:40
require在查找其缓存之前解析路径,因此路径不同并不重要。但是,您需要在测试中创建一个具有Origami属性的新Paper对象。因此,当您监视Paper, 'Origami'时,您在测试文件中本地创建的Paper对象的属性Origami将被替换为间谍。我想您可以改为执行以下操作:
Paper = require('../assets/src/coffee/origami.coffee').Paper如果现在更改Paper对象,它将与Monkey模块中使用的对象相同。然而,我建议使用像proxyquire这样的东西来监视或模拟依赖项。
https://stackoverflow.com/questions/14942984
复制相似问题