2016-06-10 86 views
6

我試圖模擬出我只用上面列出的四個庫的組件的窗口對象。用Sinon,摩卡,酶和反應嘲笑窗口

我知道它可以用JSDom完成,但客戶端反對使用它。根據我的研究,簡單地做sinon.stub(window,'location')應該可以工作,但是當我運行我的測試時,我的組件中仍然未定義Window。

目前該組件被稱爲渲染回報{} window.location.host

任何想法,我在做什麼錯中獲得興農存根出那一塊。一旦我將這一部分剔除,那麼我可以專注於測試與該窗口無關的該組件的其他部分。

我的測試方法:

import React from 'react'; 

import { shallow } from 'enzyme'; 
import chai from 'chai'; 
chai.should(); 
import sinon from 'sinon'; 

import BillingStatementRow from '../BillingStatementRow'; 

describe('Test <BillingStatementRow /> Component', function() { 

    context('Function Testing', function() { 

     it('Test - onFieldChange - Make sure it handles NaN', function() { 

      var e = {target: {value: NaN}}; 

      var window = { location : { host : "..." } }; 

      var mockedOnChange = sinon.spy(); 

      const wrapper = shallow (
       <BillingStatementRow slds={''} key={'1'} 
        Id={'1'} inputValue={'0'} salesInvoice={'SIN0001'} 
        invoicedAmount={1000} duedate={'1461628800000'} 
        outstandingBalance={1000} receiptRemaining={1000} 
        amountAllocated={1000} onChange={mockedOnChange.bind(this,'BS0001')} /> 
      ); 

      wrapper.instance().onFieldChange('amountAllocated', e); 
      wrapper.update(); 


     }) 


    }); 

}); 
+0

我假設你已經宣佈'window'第一(如一個空的對象或東西)?此外,它在任何地方都可用(即它是全球性的)嗎? **編輯**:嗯,沒關係,'window.location'不是一個函數,Sinon只能存根函數。不過,你想測試什麼?爲什麼不只是聲明一個全局的'window = {location:{host:「...」}}'? – robertklep

+0

Yep窗口是首先聲明但它仍然給我窗口沒有定義。 – DimlyAware

+1

改爲嘗試'global.window = {location:...}'。 – robertklep

回答

17

興農存根/間諜/嘲笑只有職能的工作。在這種情況下,你試圖模擬一個全局的(嵌套的)變量,Sinon並不是正確的工具。

相反,就像在瀏覽器中一樣,您可以創建一個全局對象,只嘲笑正確數量的window以使用組件,這很容易,因爲它只訪問window.location.host

所以實例化的組件之前,聲明如下:

global.window = { location : { host : 'example.com' } };