Comments (6)
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.
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.
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.
@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.
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.
@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)
- Throw meaningful error message when trying to return non-objects from stub used as constructor HOT 1
- Improve error message for immutable descriptors to include link to article HOT 1
- Spies for property accessors are not automatically cleaned up
- Use sinon to mock node-mssql HOT 1
- No useRealTimers() or runAllTimers() ? HOT 1
- I can't find the CHANGELOG HOT 9
- Elaborate on "For the stubbing to work, the stubbed method cannot be destructured, neither in the module under test nor in the test." HOT 5
- Unable to install [email protected] HOT 6
- Remove unused/meaningless exports and modules from the codebase HOT 1
- Limit assertion log to a reasonable default HOT 1
- `returns` not override `callThrough` HOT 4
- `returns` clears fake's `callArgAt` HOT 5
- Discrepancy in stub construction methods HOT 4
- Feature Request: Add API support to stub a parent class constructor. HOT 4
- .rejects doesn't match documentation HOT 2
- SyntaxError: Unexpected token . -> assert(opts?.sinonXhrLib, "No XHR lib passed in"); HOT 1
- Documentation of callIds
- Cannot stub private methods in native JavaScript classes HOT 1
- Calling replaceGetter invokes the original function HOT 4
- [Node v21.7.0] Impossible to stub `fetch` HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sinon.