javascript - Jasmine spy 报告功能已被调用时,他们还没有

标签 javascript angularjs jasmine karma-jasmine

我有以下代码:

$scope.deleteJob = function(job) {
    SandboxService.deleteJob(job.id).then(res => {
        if (res.status == 200) {
            ngToast.success();
            $scope.refreshApps();
        }
        else {
            ngToast.danger();
        }
    });
};

以及以下单元测试:

it('should show success toast on delete and refresh apps', () => {
    spyOn(sandboxService, 'deleteJob').and.returnValue(Promise.resolve({status: 500}));
    spyOn(ngToast, 'success');
    spyOn(scope, 'refreshApps');

    let mockJob = {
        'id': 1
    };

    scope.deleteJob(mockJob);

    sandboxService.deleteJob().then(() => {
        expect(ngToast.success).toHaveBeenCalled();
        expect(scope.refreshApps).toHaveBeenCalled();
    });
});

基本上,删除作业时,如果删除成功且返回状态为 200,则显示成功 toast 并刷新,否则显示危险 toast。

我预计测试会失败,因为它返回状态 500,但它通过了。这意味着 ngToast.success()scope.refreshApps() 已被调用。

我在代码中添加了一些日志,它确实返回 status: 500 并转到 else block 。

我在这里缺少什么?

最佳答案

该问题与 deleteJob 的异步性质有关。您的 it 测试甚至在执行 expect 之前就结束了。因此,您需要某种同步。这基本上可以通过 @angular/core/testing 中的 fakeAsynctick 来完成。

it('should show success toast on delete and refresh apps', fakeAsync(() => {
    ...

    sandboxService.deleteJob();
    tick();

    expect(ngToast.success).toHaveBeenCalled();
    expect(scope.refreshApps).toHaveBeenCalled();
}));

然而,问题是您正在使用下面的 spy 覆盖 deleteJob 的原始行为,因此 ngToast.successscope.refreshApps > 不会被调用并且测试将会失败。

 spyOn(sandboxService, 'deleteJob').and.returnValue(Promise.resolve({status: 500}));

关于javascript - Jasmine spy 报告功能已被调用时,他们还没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708014/

相关文章:

javascript - 时间计算算法

javascript - 将 Angular Directive(指令)与 Controller 链接

javascript - Jasmine 2 : how to handle failing beforeAll

javascript - Knockout.js – 获取对象数据

javascript - knockout 自定义点击绑定(bind),返回true防止点击劫持?

javascript - 如何在单击事件时将数据传递到 AngularJS 中的模式

javascript - Angular 动态从 ng-repeat 中删除过滤器

javascript - 生存还是毁灭

javascript - 使用 Karma 进行 ngOnInit 和 MediaChange 测试

javascript - 如何使用现有的 SVG 符号(在文件中)作为 highcharts 中的标记?