Git Product home page Git Product logo

Comments (6)

neonstalwart avatar neonstalwart commented on August 17, 2024

your problem is related to how your subject.js module gets a reference to the exports of module.js.

subject.js gets a direct reference to the exports of module.js rather than a reference to the spy that you create based on the exports of that module.

when you export an object, subject.js gets a reference to that object but when it tries to access a property of that object, you've already replaced the original function attached to that property with the spy function - this is why it works when you export an object.

your problem is not so much related to what you can or cannot spy on but rather it is a problem of what your subject.js gets a reference to when it loads. there's probably a clearer explanation but maybe that helps you see what's happening.

from sinon.

cjohansen avatar cjohansen commented on August 17, 2024

As far as I can tell, there is no way to implement stubbing of functions that are directly exported (e.g module.exports = function () { ... }), because, like @neonstalwart said, you can replace the reference itself.

from sinon.

funston avatar funston commented on August 17, 2024

why can't exporting a function reference work? it's perfectly valid JS and works in node.

this is valid:

var myObject = function () {};
module.exports = myObject;

from sinon.

neonstalwart avatar neonstalwart commented on August 17, 2024

@rschiavi the issue is not whether or not it's valid. the problem is that there's no way to get hold of the exports (or module) from outside of the module, so you can't replace the exported function with a stubbed version.

from sinon.

kris-at-tout avatar kris-at-tout commented on August 17, 2024

What about when you define your export like this:

module.js
module.exports = {
x: function() { }
}

subject.js
y = require('./module.js');
y.x();

test_subject.js
describe('subject', function() {
it('should call x()', function() {
var x = require('./module.js');
sinon.spy(x)
require('./subject.js');
assert.equal(x.called, true);
})
})

module is exporting an object, not a function directly. The error message I get is:

) subject should call x():
TypeError: Attempted to wrap undefined property undefined as function
at Object.wrapMethod (/Users/kris/node_modules/sinon/lib/sinon.js:65:23)
at Object.spy (/Users/kris/node_modules/sinon/lib/sinon/spy.js:42:22)
at Context. (/Users/kris/Development/ntest/test_subject.js:6:11)
at Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:184:32)
at Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:300:10)
at Runner.runTests.next (/usr/local/lib/node_modules/mocha/lib/runner.js:346:12)
at next (/usr/local/lib/node_modules/mocha/lib/runner.js:228:14)
at Runner.hooks (/usr/local/lib/node_modules/mocha/lib/runner.js:237:7)
at next (/usr/local/lib/node_modules/mocha/lib/runner.js:185:23)
at Runner.hook (/usr/local/lib/node_modules/mocha/lib/runner.js:205:5)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)

from sinon.

cjohansen avatar cjohansen commented on August 17, 2024

@kris-at-tout You want to do:

sinon.spy(x, "x");

And:

x.x.called

That is, you stub the x property of the exported module from module.js

from sinon.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.