2015-03-29 8 views
10

Sono un neofita del test dell'unità js e sto cercando di utilizzare mocha per il mio tutorial di backbone contact manager che ho trovato a this github repo. Tuttavia, ho una variabile globale window.ContactManager che ho voluto testare prima dell'esistenza e testare successivamente la funzionalità router.on all'interno della funzione start. La variabile appare in questo modo:Utilizzo della variabile di finestra globale in mocha js dal nodo

window.ContactManager = { 
    Models: {}, 
    Collections: {}, 
    Views: {}, 

    start: function(data) { 
    var contacts = new ContactManager.Collections.Contacts(data.contacts), 
     router = new ContactManager.Router(); 

    router.on('route:home', function() { 
     router.navigate('contacts', { 
     trigger: true, 
     replace: true 
     }); 
    }); 

    router.on('route:showContacts', function() { 
     var contactsView = new ContactManager.Views.Contacts({ 
     collection: contacts 
     }); 
..... 

Il mio test che non funziona:. var = aspettano richiedono ('chai') si aspettano;

describe("Application", function() { 
    it('creates a global variable for the name space ContactManager' , function() { 
     expect(ContactManager).to.exist; 
    }) 
}); 

Come faccio a testare e accedere a una finestra esistenza variabile globale nella moka l'esecuzione dei test nella console?

+0

'aspettarsi (window.ContactManager) .to.exist;'? –

+0

sì. Ho pensato che un primo test sarebbe stato verificare se esiste e quindi testare i trigger del router all'interno della funzione di avvio. Si prega di consultare la modifica – ivan

risposta

12

Stai ignorando la differenza tra l'esecuzione del codice JavaScript nel browser e l'esecuzione del codice JavaScript nel nodo.

Nel browser, il nome window è un riferimento all'oggetto che contiene tutte le variabili globali. Pertanto, quando si esegue foo = 1 nell'ambito più esterno, si dichiara un valore globale foo, che è anche accessibile come window.foo. Al contrario, se assegni un nuovo campo come questo: window.bar = 1, allora hai un nuovo globale chiamato bar.

Nel nodo, è possibile accedere all'oggetto globale come global. Pertanto, se si esegue foo = 1 nell'ambito più esterno, foo è accessibile anche come global.foo. E se lo fai, global.bar = 1, hai un nuovo globale chiamato bar.

Il codice mostra che si modifica un oggetto window, che non sembra essere un riferimento all'oggetto globale. Opzioni:

  1. Eseguire Mocha nel browser anziché nel nodo. Vedi Mocha's documentation.

  2. Imposta l'ambiente del nodo in modo che simuli un numero sufficiente di ambienti browser per soddisfare il nodo. Impostare una variabile globale window equivale a globalpotrebbe essere essere sufficiente ma non so Backbone abbastanza per sapere se Backbone sarà felice con questo.

  3. Eseguire il codice basato su Backbone in jsdom. Jsdom fornisce window e document realistici, come se il codice fosse in esecuzione in un browser, ma ha i suoi limiti. Non so se Backbone sarebbe felice con quei limiti.

3

Un'altra soluzione sarebbe quella di utilizzare https://www.npmjs.com/package/window-or-global

import React, { Component } from 'react' 
// in node, you'll get the global object instead of crashing by an error 
import root from 'window-or-global' 

class MyComponent extends Component { 

    // this method is only invoked in the browser environment 
    componentDidMount() { 
    root.addEventListener(/*...*/) 
    } 

    componentWillUnmount() { 
    root.addEventListener(/*...*/) 
    } 

    render() {} 

} 

// Voilà. Enjoy your universal react component! ;) 
// No more 'window is not defined' errors when you render your component 
// on server side. 

installare, eseguire npm install --save window-or-global