javascript - karma - sinon stub




oggetto finto di gelsomino (2)

Il problema è che si sovrascrive solo una proprietà dell'oggetto window. E se puoi farlo, anche il browser può farlo. Quindi, prendere in giro una funzione o una proprietà di un oggetto globale a cui tutti possono accedere non è una buona idea in generale, perché non si può mai essere sicuri che le modifiche saranno presenti quando si tenta di accedervi.

Il che mi porta all'iniezione di dipendenza . È un modello comune per rendere testabile la tua unità di codice, con particolare attenzione all'unità . Che cosa significa? Quando crei un nuovo oggetto o accedi ad un oggetto globale, non stai solo testando le funzionalità della tua unità , ma anche le funzionalità del tuo oggetto appena creato o globale. Per anteporre ciò, non si creano i nuovi oggetti nella propria unità , ma li si fa passare. Normalmente lo faresti nel costruttore, ma come nella funzione JavaScript sono oggetti con il corpo della funzione come costruttore, puoi anche passare le dipendenze semplicemente nella tua funzione.

Quindi, nel tuo caso, la funzione dipende dall'oggetto della finestra globale. Quindi, invece di provare ad accedere all'oggetto della finestra globale, passalo come parametro nella tua funzione. Facendolo in questo modo puoi passare l'oggetto finestra nel tuo codice di produzione e un semplice oggetto JavaScript con un argomento atributo nel tuo test:

function youWannaTest(w){
    console.log(w.arguments[0]);
}

Nel tuo interno chiama la funzione in questo modo:

youWannaTest(window);

Nel tuo test chiama la funzione in questo modo:

youWannaTest({arguments: ['someValue']});

Come faccio a imitare l'oggetto finestra? Sto facendo l'estensione firefox e voglio usare jasmine per i test di javascript.

Nel mio javascript ho


function submit() {
...
var url = window.arguments[0];
...
}

Ovviamente, devo prendere in giro window.arguments [0] in gelsomino perché quell'oggetto non esiste se non passa nessun parametro da window.openDialog

Questo è il mio tentativo di deriderlo con "with"


it("should submit to server", function() {

        var localContext = {
            "window": {
                arguments: ["http://localhost"]
            }

        }

        with(localContext);

Ma ottengo ancora questo errore TypeError: Impossibile leggere la proprietà '0' di undefined, è come quando viene eseguito il test window.arguments [0] viene cancellato con la finestra reale, perché se lo faccio

window.arguments[0]

all'interno del test, stampa correttamente "http: // localhost". ma quando si tratta del metodo submit () mostra l'errore che window.argument è indefinito.


Penso anche che l'iniezione di dipendenza sia la soluzione più pulita.

Il tuo JS:

function submit(_window) {
    _window = _window || window
    ...
    var url = _window.arguments[0];
    ...
}

I test dell'unità:

it('works like a dream', function () {
    var _window = { arguments: ['url'] }
    expect(submit(_window)).toBeTotallyAwesome()
})




jasmine