Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对Jasmine spy的重置调用未返回_Javascript_Jasmine_Spy_Jasmine2.0 - Fatal编程技术网

Javascript 对Jasmine spy的重置调用未返回

Javascript 对Jasmine spy的重置调用未返回,javascript,jasmine,spy,jasmine2.0,Javascript,Jasmine,Spy,Jasmine2.0,我正在使用Jasmine(2.2.0)间谍来查看是否调用了某个回调 测试代码: it('tests', function(done) { var spy = jasmine.createSpy('mySpy'); objectUnderTest.someFunction(spy).then(function() { expect(spy).toHaveBeenCalled(); done(); }); }); 这正如预期的那样有效。但现在,我要添加第二个级别: it

我正在使用Jasmine(2.2.0)间谍来查看是否调用了某个回调

测试代码:

it('tests', function(done) {
  var spy = jasmine.createSpy('mySpy');
  objectUnderTest.someFunction(spy).then(function() {
    expect(spy).toHaveBeenCalled();
    done();
  });
});
这正如预期的那样有效。但现在,我要添加第二个级别:

it('tests deeper', function(done) {
  var spy = jasmine.createSpy('mySpy');
  objectUnderTest.someFunction(spy).then(function() {
    expect(spy).toHaveBeenCalled();
    spy.reset();
    return objectUnderTest.someFunction(spy);
  }).then(function() {
    expect(spy.toHaveBeenCalled());
    expect(spy.callCount).toBe(1);
    done();
  });
});

此测试永远不会返回,因为显然从未调用
done
回调。如果我删除行
spy.reset()
,测试确实会完成,但显然在最后一次测试中失败。但是,
callCount
字段似乎是
未定义的
,而不是
2

就间谍功能而言,Jasmine 2的语法不同于1.3。 见茉莉花医生

具体来说,您可以使用
spy.calls.reset()重置间谍

测试应该是这样的:

// Source
var objectUnderTest = {
    someFunction: function (cb) {
        var promise = new Promise(function (resolve, reject) {
            if (true) {
                cb();
                resolve();
            } else {
                reject(new Error("something bad happened"));
            }
        });
        return promise;
    }
}

// Test
describe('foo', function () {
    it('tests', function (done) {
        var spy = jasmine.createSpy('mySpy');
        objectUnderTest.someFunction(spy).then(function () {
            expect(spy).toHaveBeenCalled();
            done();
        });
    });
    it('tests deeper', function (done) {
        var spy = jasmine.createSpy('mySpy');
        objectUnderTest.someFunction(spy).then(function () {
            expect(spy).toHaveBeenCalled();
            spy.calls.reset();
            return objectUnderTest.someFunction(spy);
        }).then(function () {
            expect(spy).toHaveBeenCalled();
            expect(spy.calls.count()).toBe(1);
            done();
        });
    });
});

请参见小提琴的另一种书写方式:

const spy = spyOn(foo, 'bar');
expect(spy).toHaveBeenCalled();
spy.calls.reset();

尝试为您的承诺添加拒绝处理程序。在链的末尾添加
.catch(done)
,同样的问题也会出现。因此@Daniel,如果它抛出,我无法检测到它。添加一个
try/catch
会显示异常:
'undefined'不是一个函数(评估'spy.reset()')
。我不知道为什么Q/Jasmine没有正确处理这个问题。我也不确定为什么我的spy缺少它通常应该具有的几个属性。如果您使用的是typescript,很可能bar方法没有calls键。很好的调用。固定的。