2016-05-02 2 views
7

У меня есть проект webapp, который использует rxjs5 для реализации flux, и в настоящее время я ищу решения для написания модульных тестов на нем.Использование метода мрамора rxjs5 внутри другого проекта

На самом деле, я реализовал собственные наблюдаемые внутри, например:

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(); 
} 

Я хотел бы, чтобы проверить его с помощью marble testing way и написать что-то подобное (я взял образец пример из 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); 
    }); 
    }); 

Мой вопрос:

можно ли использовать метод мрамор тестирования (с операторами, как hot, cold и т. Д.) За пределами проекта rxjs5. Я не понимаю, как использовать этот хороший инструмент в моем проекте.

Благодарим за помощь.

+1

Вы можете, но на данный момент это не очень эргономично. В принципе вам нужен экземпляр «TestScheduler», и на нем есть все методы «createHotObservable» и «expectObservable». Затем вы вызываете 'flush()' в планировщике, чтобы заставить его утверждать. –

+0

Я вижу, спасибо. Вы бы рекомендовали использовать этот метод для проверки наблюдаемых прямо сейчас? Или вы планируете подвергнуть мраморному тестированию в будущем? –

+0

Вы можете определенно использовать этот метод для проверки наблюдаемых прямо сейчас, мы есть. Пока просто не очень эргономично. –

ответ

3

Вы можете только как Ben комментарий: «это не очень эргономично».

Я использую мокко и обезьяны латание 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); 
    } 
}; 

Я отнимающая много вдохновения от ngrx/store и особенно этого файл: https://github.com/ngrx/store/blob/master/spec/helpers/test-helper.ts

и тогда я могу написать мой тест как:

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); 
}); 

Редактировать вы с a Посмотрите, как я заплачу обезьяны it здесь: https://github.com/tjoskar/ng2-lazyload-image/blob/5e1c64a3611530ce26857a566b2d76dff890a3c5/test/helpers/test-helper.ts

+0

Определенно, что мне нужно. Спасибо. –

Смежные вопросы