2016-05-02 6 views
7

मेरे पास एक वेबपैप प्रोजेक्ट है जो flux को लागू करने के लिए rxjs5 का उपयोग करता है और मैं वर्तमान में यूनिट परीक्षण लिखने के लिए समाधान ढूंढ रहा हूं।किसी अन्य प्रोजेक्ट के अंदर संगमरमर परीक्षण rxjs5 विधि का उपयोग

वास्तव में, मैं कस्टम observables लागू कर दिया है अंदर, उदाहरण के लिए:

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 का उपयोग कर इसे परीक्षण करने और की तरह कुछ लिखने के लिए चाहते हैं

(i 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

आप कर सकते हैं, लेकिन इस समय यह बहुत ergonomic नहीं है। असल में आपको 'टेस्टशेड्यूलर' के उदाहरण की आवश्यकता होती है और इसमें सभी 'createHotObservable' और 'expectObservable' विधियां और सामान हैं। फिर आप इसे बनाने के लिए शेड्यूलर पर 'फ्लश()' कहते हैं। –

+0

मुझे लगता है, धन्यवाद। क्या आप अभी इस अवलोकन का परीक्षण करने के लिए इस विधि का उपयोग करने की सलाह देंगे? या आप भविष्य में संगमरमर परीक्षण का पर्दाफाश करने की योजना बना रहे हैं? –

+0

आप अभी इस अवलोकन का परीक्षण करने के लिए इस विधि का उपयोग कर सकते हैं, हम हैं। यह अभी तक ऐसा करने के लिए बहुत ही ergonomic नहीं है। –

उत्तर

3

आप Ben टिप्पणी कर सकते हैं: "यह बहुत ergonomic नहीं है"।

मैं मोचा उपयोग कर रहा हूँ और बंदर 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); 
}); 

संपादित आप सी एक देखें कि मैं कैसे बंदर पैच it यहां: https://github.com/tjoskar/ng2-lazyload-image/blob/5e1c64a3611530ce26857a566b2d76dff890a3c5/test/helpers/test-helper.ts

+0

निश्चित रूप से मुझे क्या चाहिए। धन्यवाद। –

संबंधित मुद्दे