2016-06-10 9 views
6

Próbuję wyszydzić obiekt okna dla składnika, którego używam z tylko czterech bibliotek wymienionych powyżej.Szydzenie okna z Sinon, Mocha, Enzyme i React

Wiem, że można to zrobić za pomocą JSDom, ale klient jest przeciwny używaniu go. Na podstawie moich badań, po prostu wykonanie sinon.stub (okno, "lokalizacja") powinno zadziałać, ale kiedy przeprowadzę swoje testy, nadal otrzymuję niezdefiniowane okno w moim komponencie.

Obecnie składnik nazywa się wewnątrz tynku zamian {window.location.host}

żadnych myśli, co robię źle, aby uzyskać sinon do skrótową, że jednym kawałku. Po tym, jak wyjmę ten fragment, mogę skupić się na testowaniu innych części tego komponentu, które nie mają nic wspólnego z oknem.

moja metoda testowa:

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

Zakładam, że zadeklarowali 'window' pierwszy (jako pusty obiekt lub coś)? Czy jest on dostępny wszędzie (tzn. Czy jest globalny)? ** EDYTUJ **: hmm nieważne, 'window.location' nie jest funkcją, a Sinon może tylko odgryźć funkcje. Ale co dokładnie chcesz przetestować? Dlaczego po prostu nie ogłosić globalnego 'window = {location: {host:" ... "}}'? – robertklep

+0

Okno Yep jest zadeklarowane jako pierwsze, ale nadal daje mi okno nie jest zdefiniowane. – DimlyAware

+1

Zamiast tego spróbuj użyć 'global.window = {location: ...}. – robertklep

Odpowiedz

17

sinon stubs/szpiedzy/drwi działa tylko z funkcji. W tym przypadku próbujesz wyśmiać zmienną globalną (zagnieżdżoną), dla której Sinon nie jest właściwym narzędziem.

Zamiast tego, podobnie jak w przeglądarce, można utworzyć obiekt globalny, który kpi z właściwej ilości window do pracy z komponentem, co jest łatwe, ponieważ umożliwia dostęp tylko do window.location.host.

Więc zanim instancji komponentu, oświadczam co następuje:

global.window = { location : { host : 'example.com' } }; 
Powiązane problemy