2016-06-21 40 views
1

我正在使用Mocha/Chai/Sinon測試React組件,並使用諸如renderedComponent.getTodos(callback)之類的內容在不同的文件中調用AJAX請求。我正在傳遞一個類似於這個Sinon FakeServer tutorial的回調。但是,我收到一個奇怪的語法錯誤,導致回調不被調用,因此server.requests爲空。Sinon Fakeserver測試不同的組件/文件 - 沒有請求?

我知道我問了一個類似的問題here - 但是,這個問題在這裏有所不同,我在不同的文件中調用AJAX請求,而不是在同一個文件中,現在解決方案在以前工作已不再工作。我不知道爲什麼。一般來說,我的問題是:是否有什麼關於在不同的文件中包含一個函數,導致Sinon無法加載到我的JSDOM實例中?

供參考,這是我的renderedComponent初始化和FakeServer碼,坐在我的測試文件:

test.js

renderedComponent = ReactTestUtils.renderIntoDocument(
     <Component...> 
     <p>Drag &amp; drop files here or click here to browse for files.</p> 
     </Component> 


... 

describe('Testing', function(){ 
    var server; 

    before(function() { server = sinon.fakeServer.create(); }); 
    after(function() { server.restore(); }); 

    it("calls callback with deserialized data", function() { 
     var callback = sinon.spy(); 
     renderedComponent.getTodos(callback); 

     // This is part of the FakeXMLHttpRequest API 
     server.requests[0].respond(
      200, 
      { "Content-Type": "application/json" }, 
      JSON.stringify([{ id: 1, text: "Provide examples", done: true }]) 
     ); 

     assert(callback.calledOnce); 
    }); 

,這裏是在renderedComponentserverRequest功能,這是在我試圖測試的另一個文件中的React組件:

Component.js

var Component = React.createClass({ 

... 

    function getTodoscallback) { 
     $.ajax({ 
      url: "/todo/items", 
      success: function (data) { 
       // Node-style CPS: callback(err, data) 
       callback(null, data); 
      } 
     }); 
    } 
} 

添加一個error參數AJAX請求從jsdom節點模塊揭示了語法錯誤試圖做urlObj = new URL(uri, documentBaseURLSerialized(this._ownerDocument));

我的直覺是,這與JSDom裝載jQuery和興農做的,但超越我不知道 - 我會很感激任何幫助。

+0

目前尚不清楚在什麼文件中。事實上,你應該編輯你的問題,使其成爲[mcve],以便人們可以重現你得到的錯誤。所有各個部分如何相互關聯的細節非常重要。 – Louis

+0

@Louis我試圖弄清楚什麼是文件。請讓我知道是否還有其他事情可以做。 – frogbandit

回答

0

好吧,我設法與此設置來解決這個問題:

import jsdom from 'jsdom'; 
import _$ from 'jquery'; 

global.jsdom = jsdom.jsdom; 
global.document = global.jsdom('<!doctype html><html><body></body></html>'); 
global.window = global.document.defaultView; 
global.XMLHttpRequest = global.window.XMLHttpRequest; 
global.navigator = window.navigator; 

global.sinon = require('sinon'); 
global.sinon.useFakeXMLHttpRequest(); 

global.window.XMLHttpRequest = global.XMLHttpRequest; 
global.$ = _$(global.window); 

問題看起來是我需要設置兩個jQuery和興農爲全局變量。仍然不完全確定,但感謝它的工作。