GithubHelp home page GithubHelp logo

Comments (9)

carlosble avatar carlosble commented on April 27, 2024 3

Polluting the global document causes side effects among tests, they basically share the DOM thus causing nasty behaviors when running multiple tests with Mocha for example. So that workaround fixes one problem but causes others

from enzyme.

zazaian avatar zazaian commented on April 27, 2024 2

Hey all - just for reference, requiring jsdom prior to requiring enzyme fixed this issue for me as well. Thanks to all for the assistance here.

from enzyme.

lelandrichardson avatar lelandrichardson commented on April 27, 2024

Hmm. Surprised this is happening. I will look into it as soon as I get a sec.

from enzyme.

lelandrichardson avatar lelandrichardson commented on April 27, 2024

@silvenon I'm looking into this but it looks like React 0.14 has a hard dependency on document.createElement at require-time in order to get this to work properly, where-as React 0.13 did not. There may be a way around this, but I'm not sure what it is yet.

In the mean time, you should be able to get this working by requiring jsdom and leak it to the global object before requiring enzyme (which is what jest is doing, FWIW).

global.document = require('jsdom').jsdom('');
var { mount } = require('enzyme');

// use `mount` here like normal, but don't use `describeWithDOM`...

note that the usage of require over import here is intentional, since the first statement must be executed before enzyme (and thus react) get's required.

I'm working on a less brittle way to fix this...

from enzyme.

silvenon avatar silvenon commented on April 27, 2024

I managed to keep my precious imports by adding this helper:

// test/global.js
import jsdom from 'jsdom';

global.document = jsdom.jsdom('');
global.window = document.defaultView;
global.navigator = window.navigator;

And passing --require ./test/global to Mocha, which ensured that it will be loaded first.

I also had to define window and navigator. navigator because react-dom was calling navigator.userAgent.indexOf(), which was throwing.

Thanks, it works now πŸ˜ƒ

from enzyme.

silvenon avatar silvenon commented on April 27, 2024

I realized that my solution only initializes the document once, is this bad?

from enzyme.

lelandrichardson avatar lelandrichardson commented on April 27, 2024

@silvenon it depends. Doing so can simplify a lot of things. some libraries will cache a reference to the document at require time (like jquery) and thus you have to jump through a lot of hoops to have code work when using a new document for every test. We plan on using only a single document for our entire test suite at airbnb soon, but we don't yet.

As far as react goes, enzyme's mount() uses TestUtils.renderIntoDocument internally which doesn't even attach itself to the main document, so it has pretty limited side effects that could affect other tests, but you still need to be conscious about some DOM APIs that will have side effects across tests.

Also, you should be able to refresh the document later on in your tests and react will work just fine with it. React doesn't cache any document references AFAICT, it just uses whatever document is off the global.

from enzyme.

silvenon avatar silvenon commented on April 27, 2024

Thanks for the detailed explanation πŸ‘ Learning so much from you guys.

from enzyme.

lelandrichardson avatar lelandrichardson commented on April 27, 2024

Closing this issue as it should now be "fixed". This problem should no longer exist so long as you have a global document object prior to requiring react for the first time.

from enzyme.

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.