Angular JS,单元测试:期待回调

Angular JS,单元测试:期待回调,angular,unit-testing,typescript,jasmine,leaflet,Angular,Unit Testing,Typescript,Jasmine,Leaflet,我正在使用传单,我正在上面做一个标记。鼠标离开此标记后,我想删除显示在鼠标指针上的弹出窗口: marker.on('mouseout', e => this.leafletMap.closePopup()); 在我的测试中,我想知道提供的回调是否符合我的预期 我已经测试了mouseout上是否发生了事件 expect((mockedMarker.on as jasmine.Spy).calls.argsFor(0)[0]).toEqual('mouseover'); 有什么办法吗 我试

我正在使用传单,我正在上面做一个标记。鼠标离开此标记后,我想删除显示在
鼠标指针上的弹出窗口

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));
但是我不知道自己在做什么(我是单元测试新手),我也无法在网上找到解决方案,因为我真的不知道如何调用这种测试


我应该声明,我使用的是类型脚本

您所做的不是单元测试,但既然您想要测试,我会给出一个解决方案。下面是我为您编写的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)

看起来您想要测试的是函数回调做了您想要做的事情。为此,您不应该检查函数字符串。那个测试太脆弱了

相反,您应该检查调用回调时,传单是否已关闭。这里有一个简单的测试。它假设您已经正确地搭建了标记、传单和回调:

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

expect((mockedMarker.on作为jasmine.Spy.calls.argsFor(0)[1].toString()).toEqual(“e=>this.传单映射.closePopup()”)如何)
toEqual
将是一个字符串?因为当我测试它时,期望的变量类型是一个函数…期望是一个通用接口,它可以接受很多东西。我建议你试一试。基本上,您希望获得传递的函数,并执行toString并获得lambda定义。虽然这是诚实的不需要,但只是因为你坚持这样做,我提供了一个解决方案。这可能不是定义上的单元测试不,这不是我的意思:我已经用不同的字符串尝试过了,结果是“expect[myString]to equal Function”。我同意这不是一个单元测试,我只希望我的文件有100%的覆盖率。我只是不知道如何覆盖这个lambda…你能把
(mockedMarker.on作为jasmine.Spy).calls.argsFor(0)[1]
转换成一个变量,看看你到底得到了什么吗?如果
toString()
在同一个屏幕上,则会显示lambda def。如果是,则将其分为两个步骤