Javascript jasmine:spyOn(obj,';方法';)。和callFake还是and.callFake?

Javascript jasmine:spyOn(obj,';方法';)。和callFake还是and.callFake?,javascript,jasmine,Javascript,Jasmine,我想在Jasmine测试中模拟测试数据。以下是两个版本: // version 1: spyOn(mBankAccountResource, 'getBankAccountData').and.callFake(fakedFunction); // version 2: spyOn(mBankAccountResource, 'getBankAccountData').andCallFake(fakedFunction); 当我使用浏览器(Chrome、Firefox)执行测试时,第一个版本

我想在Jasmine测试中模拟测试数据。以下是两个版本:

// version 1:
spyOn(mBankAccountResource, 'getBankAccountData').and.callFake(fakedFunction);

// version 2:
spyOn(mBankAccountResource, 'getBankAccountData').andCallFake(fakedFunction);
当我使用浏览器(Chrome、Firefox)执行测试时,第一个版本就可以工作了。但是,当我使用phantomjs运行相同的测试时,我必须使用第二个版本。否则,它会抱怨函数未定义

以下是错误消息:

// phantomjs (with version 1)
    TypeError: 'undefined' is not an object (evaluating 'spyOn(mBankAccountResource, 'getBankAccountData').and.callFake')
    at /home/phil/workspaces/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65
    at invoke (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular/angular.js:3707)
    at workFn (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular-mocks/angular-mocks.js:2149)
undefined

// Chrome (with version 2)
TypeError: Object function () {
        callTracker.track({
          object: this,
          args: Array.prototype.slice.apply(arguments)
        });
        return spyStrategy.exec.apply(this, arguments);
      } has no method 'andCallFake'
    at Object.<anonymous> (/home/phil/workspaces/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65:59)
    at Object.invoke (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular/angular.js:3707:17)
    at Object.workFn (/home/phil/workspaces/world/basket.angular.ui/bower_components/angular-mocks/angular-mocks.js:2149:20)
//phantomjs(版本1)
TypeError:“undefined”不是对象(正在计算“spyOn(mBankAccountResource,'getBankAccountData')。和.callFake')
at/home/phil/workspace/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65
在调用时(/home/phil/workspace/world/basket.angular.ui/bower\u components/angular/angular.js:3707)
工作时fn(/home/phil/workspace/world/basket.angular.ui/bower\u components/angular mocks/angular mocks.js:2149)
未定义
//Chrome(版本2)
TypeError:对象函数(){
callTracker.track({
对象:这个,,
args:Array.prototype.slice.apply(参数)
});
返回spysttrategy.exec.apply(这是参数);
}没有方法“andCallFake”
反对。(/home/phil/workspace/world/basket.angular.ui/basket.angular.ui/test/bankaccount/BankAccountCtrlTest.js:65:59)
在Object.invoke(/home/phil/workspace/world/basket.angular.ui/bower\u components/angular/angular.js:3707:17)
位于Object.workFn(/home/phil/workspace/world/basket.angular.ui/bower\u components/angular mocks/angular mocks.js:2149:20)
我搜索了Jasmine API,但找不到哪个版本是正确的。我发现的所有示例似乎都使用了第二个版本


茉莉花的API最近有变化吗?如何编写测试,使其始终有效?

是的,spy API从Jasmine 1.3.1更改为Jasmine 2.0。没有“正确”的版本。如果你能找到支持Jasmine 2.0的工具,我建议升级

Jasmine 1.3.1语法()

Jasmine 2.0语法()

我提到工具支持是因为这似乎是您面临的问题。Jasmine 2.0只发布了几个月(在撰写本文时)。相比之下,Karma中对Jasmine 2.0的支持已经停止了几个星期(我不确定是否还有其他工具)


要解决您的问题,请调查您正在使用哪些工具来运行测试,并查看其中是否有任何工具支持Jasmine 2.0。如果他们都这么做了,那就去升级吧。否则,将浏览器测试降级为Jasmine 1.3.1,并等待工具支持更好。只需确保您在所有方面都保持一致。

实际上,您的版本1对应于Jasmine 2.0。你是怎么管理这些的?你在使用Karma runner吗?@EdwinDalorzo我在命令行上运行了phantomjs,并在IntelliJ上运行了其他测试。也许这就是原因。总之,结合Eric的回答,我想我知道如何排除故障。谢谢谢谢我的karma jasmine全球安装版本是2.0,但一些项目在本地使用了karma jasmine 1.3。根据我执行测试的方式,使用的是2.0或1.3版本。
spyOn(mBankAccountResource, 'getBankAccountData').andCallFake(fakedFunction);
expect(mBankAccountResource.getBankAccountData.mostRecentCall.args).toEqual(["foo"]);
// Methods moved to 'and' property
spyOn(mBankAccountResource, 'getBankAccountData').and.callFake(fakedFunction);

// Call data moved to 'calls' property
expect(mBankAccountResource.getBankAccountData.calls.mostRecent().args).toEqual(["foo"]);