Comments (8)
Ah, roger that.
from tapjs.
Actually, you know, "mock the imported thing" is a reasonable guess as to what a method named mockInport()
does. Maybe the docs need to clarify this a bit better.
Reopening as a doc issue.
from tapjs.
it was especially confusing because I was coming from jest's jest.mock.
It's a matter of taste, so there's really no right or wrong answer per se, and the word "mock" is super overloaded in the testing space so it's a reasonable approach I guess, but personally I find jest's import mocking pretty confusing to reason about. It's sort of global, but not exactly, and feels very magical. Tap's import mocking is just a specific function that loads the actual module code, but with its dependencies injected with known values, so you can do the mocked import behavior in a clearer and more isolated scope.
It's also handy when you want to have a single test file that mocks things in a bunch of different ways, so eg you can load a module with { path: path.posix }
and then a second time with { path: path.win32 }
to test different branches, or just load the module fresh with different globals/env values, etc.
from tapjs.
I'd thought about naming it t.import()
, probably would have made it more clear that it's "import this module (with some tweaked deps)". But the concern there was import { import } from 'tap'
wouldn't work, you'd have this special keyword making footguns etc.
from tapjs.
That's not what mock import does.
It's for mocking the things that that module imports.
Example, if a.js
imported b.js
, you could do this:
// a.js
import { foo } from './b.js'
export { foo }
// b.js
export const foo = 'bar'
// a.spec.js
import t from 'tap'
const a = await t.mockImport('./a.js', {
'./b.js': {
foo: 'baz'
}
})
console.log(a.foo) // 'baz'
In other words, it's not "a thing that you import and then mock", it's "load this module, but with a mocked import()
method".
If you just want to import something and then swap out some fields, check out t.capture
and t.intercept
.
For example:
import t from 'tap'
const a = await import('./a.js')
t.equal(a.foo, 'bar')
const fooAccesses = t.intercept(a, 'foo', { value: 'baz' })
t.equal(a.foo, 'baz')
console.error(fooAccesses) // [ { type: 'get', value: 'baz', ... } ]
from tapjs.
@isaacs it was especially confusing because I was coming from jest's jest.mock
.
from tapjs.
Hmm, using your example gives me:
const fooAccesses = t.intercept(a, 'foo', { value: 'baz' });
Error: Cannot intercept property 'foo', defined {configurable:false}
import t from 'tap';
const a = await import('./a.js');
t.equal(a.foo, 'bar');
const fooAccesses = t.intercept(a, 'foo', { value: 'baz' });
t.equal(a.foo, 'baz');
console.error(fooAccesses);
from tapjs.
Oh, yeah, if a thing is {configurable:false}
then there'd be no way to intercept it.
But you could always put it on a different object, and intercept that.
import t from 'tap';
const a = { ...(await import('./a.js')) };
t.equal(a.foo, 'bar');
const fooAccesses = t.intercept(a, 'foo', { value: 'baz' });
t.equal(a.foo, 'baz');
console.error(fooAccesses);
from tapjs.
Related Issues (20)
- [FEATURE] Can't see cause or aggregate details for uncaught errors HOT 13
- [FEAT] `--disable-coverage` should imply `--allow-empty-coverage` HOT 5
- [BUG] Coverage map is not working HOT 2
- [BUG] tap.before/tap.teardown are weird when import and requiring `tap` HOT 1
- [BUG] Async and Sync Tests don't run as intended with `@tapjs/mocha-global` HOT 3
- [BUG] mocha-globals before/after hook functions no longer support a done function? HOT 1
- [BUG] mocha-globals beforeEach hooks run for describes too when it should only for it tests HOT 1
- [BUG] Long standing bug in ink is causing crash on start. HOT 3
- [BUG] matchSnapshot returns RangeError HOT 3
- [BUG] TypeError: Cannot read private member #Class from an object whose class did not declare it HOT 3
- [BUG] Timeout error when running Node.js HTTP Server with TAP HOT 3
- [BUG] test context is not passed to subtest if accessed in beforeEach HOT 2
- [BUG] Performance degradation when setTimeout / setImmediate is not used in parent test
- [BUG] Performance degradation when large number of assertions is checked at once, with non-silent reporter
- [FEATURE] I can't use path aliases for typescript projects HOT 1
- [BUG] Tap.END does fully close the project with success HOT 2
- coverage map path in extended configs should be relative to the extended config, not the original config HOT 1
- tap command not found HOT 3
- [BUG] Typo in manpage -h HOT 3
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 tapjs.