javascript - 预期的 spy 不会被内部函数调用

标签 javascript angularjs unit-testing karma-jasmine

我正在使用 AngularJS 编写一个应用程序。我正在用 karma 和 jasmine 为我的 Angular 服务编写单元测试。它没有按预期工作,因为单元测试不断给我这些错误:

Expected spy photo to have been called.

这是我的带有错误的代码笔:https://codepen.io/aubz/pen/zXyvbj

这是我的单元测试的代码片段:

  it('should process the plain clocking settings', function () {

    ClockingRecordTypeFactory.getRecord('plain', 'here', null, null, null, null, null);

    spyOn(ClockingRecordTypeFactory, 'plain').and.callFake(function () {});
    spyOn(ClockingRecordTypeFactory, 'photo').and.callFake(function () {});
    spyOn(ClockingRecordTypeFactory, 'geo').and.callFake(function () {});
    spyOn(ClockingRecordTypeFactory, 'manual').and.callFake(function () {});

    expect(ClockingRecordTypeFactory.plain).toHaveBeenCalled();
    expect(ClockingRecordTypeFactory.photo).not.toHaveBeenCalled();
    expect(ClockingRecordTypeFactory.geo).not.toHaveBeenCalled();
    expect(ClockingRecordTypeFactory.manual).not.toHaveBeenCalled();

});

以及我要测试的功能:

function getRecord(type, origin, coords, imageData, comments, reason, date) {

    var record = getBaseClockingRecord();

    if (type === 'plain') {
        plain(record);
    }

    if (type === 'photo') {
        photo(record);
    }

    if (type === 'geo') {
        geo(record, coords);
    }

    if (type === 'manual') {
        manual(record);
    }

    return record;
}

最佳答案

测试是在监视 ClockingRecordTypeFactory.plain 但实际上 getRecord 函数调用本地函数 plain 所以 spy 不会被调用全部。

您可以通过像这样更改 getRecord 让 spy 按预期工作:

if (type === 'plain') {
    this.plain(record);
}

if (type === 'photo') {
    this.photo(record);
}

if (type === 'geo') {
    this.geo(record, coords);
}

if (type === 'manual') {
    this.manual(record);
}

在调用 getRecord 之前,您还需要在测试开始时设置 spy :

spyOn(ClockingRecordTypeFactory, 'plain').and.callFake(function () {});
spyOn(ClockingRecordTypeFactory, 'photo').and.callFake(function () {});
spyOn(ClockingRecordTypeFactory, 'geo').and.callFake(function () {});
spyOn(ClockingRecordTypeFactory, 'manual').and.callFake(function () {});

ClockingRecordTypeFactory.getRecord('plain', 'here', null, null, null, null, null);

Updated Codepen

关于javascript - 预期的 spy 不会被内部函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55853317/

相关文章:

javascript - HTML5 Required 字段错误信息问题

javascript - 构造动态变量 - AngularJS

javascript - Angular ng-repeat 列表值分割

ruby-on-rails - 是否应该在 Rails 中测试 native 验证?

javascript - 如何对大型表单使用 float 保存按钮并在实际保存按钮可见时隐藏它位置不只是页面底部的angularjs

javascript - 用于检查数字字段不具有/或具有所有相同数字的正则表达式

javascript - AngularJS - 路由更改时更新 Controller

angularjs - 如何在动态html模板中添加ui-sref?

node.js - 停止测试运​​行 mocha

unit-testing - Visual Studio 2015 订购测试。如何使用.runsettings