我正在使用 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);
关于javascript - 预期的 spy 不会被内部函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55853317/