2015-05-04 43 views
3

使用React 13.2並期望使用像此gist上顯示的設置來測試生命週期。如果我不停止隨後呈現(通過shouldComponentUpdate方法),那麼什麼導致渲染(初始後)與拋出:DOMException錯誤文件爆炸:React摩卡渲染,DOMException錯誤的文檔

 DOMException: Wrong document 
at core.Node.insertBefore (D:\development\projects\fsm\node_modules\jsdom\lib\jsdom\level1\core.js:583:13) 
at core.Node.insertBefore (D:\development\projects\fsm\node_modules\jsdom\lib\jsdom\level2\events.js:326:32) 
at insertChildAt (D:\development\projects\fsm\node_modules\react\lib\DOMChildrenOperations.js:34:14) 
at Object.DOMChildrenOperations.processUpdates (D:\development\projects\fsm\node_modules\react\lib\DOMChildrenOpertions.js:106:11) 

JSDOM保釋金,因爲父節點不是一個文件,它不會與插入的孩子共享同一個所有者文件。是啊。除非React在底層做了一些有趣的事情,否則擁有文檔除了全局之外怎麼可能是其他任何東西。

只是感到驚訝,我沒有看到更多的人有類似的問題?我的摩卡設置和渲染的JSX組件都沒有奇怪的球。加上最初的渲染效果也不錯。

+0

找到答案(HTTPS://組因爲Ben Alpert和Jonathan Kim指出React緩存文檔,儘管在每個測試用例之前都創建了一個實例。 –

回答

4

更新節點4

隨着節點4,我們可以使用最新jsdom和更好的辦法解決這個問題,例如使用testdom

這是我的測試陣營0.13組件與摩卡節點4:

import testDom from "testdom"; 
import { expect } from "chai"; 

testDom("<html><body></body></html>"); 
const React = require("react/addons"); 
const MyTestableComponent = require("../src/MyTestableComponent"); 
const ExecutionEnvironment = require("react/lib/ExecutionEnvironment"); 
ExecutionEnvironment.canUseDOM = true; 

describe("MyTestableComponent",() => { 
    it("works!",() => { 
     const component = <MyTestableComponent />; 
     expect(true).to.equal(true); 
    }) 
}) 

需要注意的是,我們應該require而不是import反應,該組件。


以前的答案

我可以通過以下的OP自己的問題意見解決這個問題。

由於當需要陣營存儲在內部變量document的,我們需要刪除從require.cache對象發生反應,再次需要它之前:

var jsdom = require("jsdom").jsdom; 
var React, TestUtils; 

describe("Example", function() { 

    beforeEach(function() { 
    // remove react from the require cache 
    for (var key in require.cache) { 
     if (key.match(/\/node_modules\/react\//)) { 
     delete require.cache[key]; 
     } 
    } 

    // init the DOM 
    global.document = jsdom("<html><head><script></script></head><body></body></html>"); 
    global.window = document.parentWindow; 

    // require react again  
    React = require("react/addons"); 
    TestUtils = React.addons.TestUtils; 

    }); 

    // my tests... 

}); 
+1

這應該被標記爲正確的。 – silvenon

+0

但我得到一個性能降級重複測試這個設置:不知道是否有什麼事情'afterEach' – gpbl

+0

看來,這是造成錯誤的元件使用'refs': 錯誤:不變違規:addComponentAsRefTo (...):只有ReactOwner可以擁有參考。這通常意味着您正在嘗試將ref添加到沒有所有者的組件(即,不是在另一個組件的render方法內創建的)。嘗試在一個新的頂級組件內部渲染這個組件,這個組件將包含參考文獻' – silvenon