ค้นหาเว็บไซต์

angular - JS, การทดสอบหน่วย: คาดหวังจากการเรียกกลับ


ฉันกำลังใช้ Leaflet และกำลังสร้างมาร์กเกอร์บนมัน เมื่อเมาส์ออกจากมาร์กเกอร์นี้ ฉันต้องการลบป็อปอัพที่ฉันแสดงใน mouseenter :

marker.on('mouseout', e => this.leafletMap.closePopup());

ในการทดสอบของฉัน ฉันต้องการทราบว่าการเรียกกลับที่ให้มาคือสิ่งที่ฉันคาดหวังหรือไม่

ฉันได้ทดสอบแล้วว่ากิจกรรมเกิดขึ้นเมื่อ mouseout กับ

expect((mockedMarker.on as jasmine.Spy).calls.argsFor(0)[0]).toEqual('mouseover');

มีไอเดียเกี่ยวกับวิธีทำไหม?

ฉันลองทำอะไรประมาณนี้

expect((mockedMarker.on as jasmine.Spy).calls.argsFor(0)[1]).toEqual(JSON.stringify(component.leafletMap.closePopup));

แต่ฉันไม่รู้ว่ากำลังทำอะไรอยู่ (ฉันเพิ่งเริ่มทำ unit testing) และฉันหาวิธีแก้ปัญหาออนไลน์ไม่เจอเพราะฉันไม่ค่อยรู้ว่าจะเรียกการทดสอบประเภทนี้ว่าอะไร

ฉันควรระบุว่าฉันทำงานใน Typescript.

คำตอบ #1

สิ่งที่คุณกำลังทำไม่ใช่การทดสอบหน่วย แต่เนื่องจากคุณต้องการทดสอบ ฉันจึงจะให้วิธีแก้ปัญหา ด้านล่างเป็นตัวอย่างสคริปต์ Jasmine ที่ฉันทำให้คุณ

let marker = function() {
    function on(a, b) {
        console.log(a, b);
    }

    this.on = on;
}
describe('this', () => {
    it('xya', () => {
        y = new marker()
        spyOn(y, 'on');
        y.on('onmouseout', e => this.leafletMap.closePopup());
        const lambda = y.on.calls.argsFor(0)[1]
        console.log(lambda.toString())
        expect(lambda.toString()).toEqual("e => this.leafletMap.closePopup()")
    })
})

กำลังรันบนเทอร์มินัล

npx jasmine mocking.js
Randomized with seed 33786
Started
e => this.leafletMap.closePopup()
.


1 spec, 0 failures
Finished in 0.006 seconds
Randomized with seed 33786 (jasmine --random=true --seed=33786)

คำตอบ #2

ดูเหมือนว่าที่คุณต้องการทดสอบคือฟังก์ชัน callback ทำงานตามที่คุณต้องการ สำหรับสิ่งนั้น คุณไม่ควรตรวจสอบสตริงของฟังก์ชัน การทดสอบนั้นจะเปราะบางเกินไป

แทนที่จะเป็นเช่นนั้น คุณควรตรวจสอบว่าเมื่อคุณเรียกใช้ callback แผ่นพับได้ถูกปิดแล้ว นี่คือตัวอย่างการทดสอบง่าย ๆ สำหรับสิ่งนั้น ซึ่งสมมติว่าคุณได้จัดเตรียม marker, แผ่นพับ, และ callback ไว้อย่างถูกต้องแล้ว:

describe('Marker', () => {
    it('should invoke closePopup', () => {
        let marker = createMarkerWithLeaflet();
        spyOn(marker, 'on');
        spyOn(marker.leaflet, 'closePopup');

        marker.on.calls.argsFor(0)[1]();
        expect(marker.leaflet.closePopup).toHaveBeenCalled();
    });
});

บทความที่เกี่ยวข้อง