2016-06-10 67 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' } };