2017-06-20 22 views
14

मैं अपने आवेदन में एक कोणीय सेवा का परीक्षण करने की कोशिश कर रहा हूं, जो socket.io क्लाइंट बनाता है।कोणीय में यूनिट परीक्षण सॉकेट.io

export class SocketService { 
    private name: string; 
    private host: string = window.location.protocol + "//" + window.location.hostname + ":3000"; 
    socket: io.Socket; 

    constructor() { } 

    subscribeEvent(name: string): Observable<IJobResp> { 
    this.setup(name); 
    return new Observable(observer => { 
     this.socket.on('job', val => observer.next(val)) 
    }) 
    } 

    private setup(name: string) { 
    this.name = name; 
    let socketUrl = this.host + "/" + this.name; 
    this.socket = io.connect(socketUrl); 
    } 
} 

तो अपने परीक्षण लिखने के लिए, मैं नकली सॉकेट पुस्तकालय का उपयोग कर रहा एक नकली socket.io सर्वर स्थापित करने के लिए: मेरी सेवा कुछ इस तरह लग रहा है।

describe('SocketService',() => { 
    let socket; 

    const mockServer = new Server('http://localhost:3000/'); 
    mockServer.on('connection', server => { 
    mockServer.emit('job', 'test message 1'); 
    }); 

    (window as any).io = SocketIO; 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [JobService] 
    }); 
    }); 

    it('should xyz, inject([JobService], fakeAsync((service: JobService) => { 
    service.subscribeEvent('/').subscribe(val => { 
     expect(val).toEqual('test message 1'); 
    }) 
    }))); 
}); 

हालांकि, कि परीक्षण त्रुटि फेंकता है:: यहाँ क्या परीक्षण की तरह लग रहा है

Error: Cannot make XHRs from within a fake async test.

अगर मैं fakeAsync की जरूरत नहीं है, तो परीक्षण subscribe() में दावे से पहले गुजरता है संसाधित।

मैं इसके आसपास कैसे हो सकता हूं?

अद्यतन:

एक और दृष्टिकोण मैं कोशिश की है async उपयोग करने के लिए है जैसे

it('should subscribe to dwnTime events', async(inject([JobService], (service: JobService) => { 
    service.subscribeEvent('line/602').subscribe(val => { 
     expect(val).toEqual('test 2'); 
    }) 
    }))); 

तो मैं मिलता है:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

यह एक समय मुद्दा तरह लग रहा है, लेकिन मैं अभी भी यकीन है कि क्यों नहीं कर रहा हूँ?

+0

यदि यह ग्लोबल्स का संदर्भ नहीं देता है तो आपकी सेवा का परीक्षण करना आसान होगा। 'Io' इंजेक्ट क्यों न करें या कम से कम इसे आयात करें ताकि कुछ इसे बदल सके? –

उत्तर

1

आपका दूसरा दृष्टिकोण इसलिए आप

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; की स्थापना करके टाइमआउट बढ़ाने की आवश्यकता

कहीं भी वर्णन अंदर

(मूल्य समायोजित किया जा रहा है), नकली सर्वर के रूप में एक असली एक है सही एक है समारोह।

Here आप एक पूर्ण उदाहरण पा सकते हैं।

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