JS, модульное тестирование: ожидайте обратного вызова


Я использую листовку и создаю на ней маркер. Как только мышь выйдет из этого маркера, я хотел бы удалить всплывающее окно, которое я показываю на 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));

Но я не знаю, что делаю (я новичок в модульном тестировании), и я не могу найти решение в интернете, потому что я действительно не знаю, как назвать этот вид теста.

Я должен заявить, что работаю в машинописи.
2 5

2 ответа:

Похоже, что вы хотите проверить, что функция обратного вызова делает то, что вы хотите. Для этого вы не должны проверять строку функции. Этот тест будет слишком хрупким.

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

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

То, что вы делаете, не является юнит-тестом, и, поскольку вы хотите проверить, я бы дал решение. Ниже приведен пример сценария Жасмин, который я разработал для вас

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)