2016-05-02 18 views
7

Ho un progetto webapp che utilizza rxjs5 per implementare un flux e attualmente sto cercando soluzioni per scrivere test di unità su di esso.Utilizzo del metodo rxjs5 di test del marmo all'interno di un altro progetto

In realtà, ho implementato osservabili personalizzati all'interno, per esempio:

function getActivityObservable(events, timeout) { 
    return Observable.create((observer) => { 
    const deb = debounce(() => observer.next(false), timeout || DEFAULT_TIMEOUT); 
    const sub = events.subscribe((e) => { 
     if (!e) { 
     deb.cancel(); 
     observer.next(false); 
     } else { 
     observer.next(true); 
     deb(e); 
     } 
    }); 

    return() => { 
     if (sub) sub.unsubscribe(); 
     if (deb) deb.cancel(); 
    }; 
    }).distinctUntilChanged(); 
} 

vorrei testarlo utilizzando il marble testing way e scrivere qualcosa di simile (ho preso un esempio di esempio da repository rxjs)

describe("getActivityObservable",() => { 
    it("should debounce by selector observable",() => { 
     const e1 = hot("--a--bc--d----|"); 
     const e1subs = "^    !"; 
     const expected = "----a---c--d--|"; 

     expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected); 
     expectSubscriptions(e1.subscriptions).toBe(e1subs); 
    }); 
    }); 

La mia domanda è:

E 'possibile utilizzare il metodo di prova in marmo (con operatori come hot, cold e così via ...) al di fuori del progetto rxjs5. Non capisco come usare questo simpatico strumento nel mio progetto.

Grazie per il vostro aiuto.

+1

Si può, ma non è molto ergonomico al momento. Fondamentalmente hai bisogno di un'istanza di 'TestScheduler' e contiene tutti i metodi' createHotObservable' e 'expectObservable'. Quindi chiami 'flush()' sullo scheduler per farlo affermare. –

+0

Vedo, grazie. Consiglieresti di usare questo metodo per testare gli osservabili in questo momento? O hai intenzione di esporre i test di marmo in futuro? –

+0

si potrebbe sicuramente usare questo metodo per testare osservabili in questo momento, lo siamo. Non è ancora molto ergonomico farlo ancora. –

risposta

3

È possibile ma come commento Ben: "non è molto ergonomico".

sto usando moka e la scimmia patching it:

const isEqual = require('lodash.isequal'); 
const TestScheduler = require('rxjs/testing/TestScheduler').TestScheduler; 

const assertDeepEqualFrame = (actual, expected) => { 
    if (!isEqual(actual, expected)) { 
    throw new Error('Frames not equal!'); 
    } 
} 

const oit = global.it; 
global.it = function(description, cb, timeout) { 
    if (cb.length === 0) { 
    oit(description, function() { 
     global.rxTestScheduler = new TestScheduler(assertDeepEqualFrame); 
     cb(); 
     global.rxTestScheduler.flush(); 
    }); 
    } else { // async test 
    oit.apply(this, arguments); 
    } 
}; 

ho prendendo un sacco di ispirazioni da ngrx/store e soprattutto questo file: https://github.com/ngrx/store/blob/master/spec/helpers/test-helper.ts

e poi posso scrivere il mio test come:

it('should filter with an always-true predicate',() => { 
    const source = hot('-1--2--^-3-4-5-6--7-8--9--|'); 
    const expected =   '--3-4-5-6--7-8--9--|'; 
    const predicate =() => { return true; }; 

    expectObservable(source.filter(predicate)).toBe(expected); 
}); 

Modifica È c un vedo come patch scimmia it qui: https://github.com/tjoskar/ng2-lazyload-image/blob/5e1c64a3611530ce26857a566b2d76dff890a3c5/test/helpers/test-helper.ts

+0

Sicuramente quello di cui avevo bisogno. Grazie. –

Problemi correlati