jasmine:spyOn(obj,'method').CallFake or和.callFake?

我想在我的茉莉花testing中模拟testing数据。 这里有两个版本:

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

当我用浏览器(Chrome,Firefox)执行我的testing时,第一个版本可以正常工作。 但是,当我用phantomjs运行相同的testing时,我必须使用第二个版本。 否则,它会抱怨函数没有被定义。

这里是错误信息:

 // 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) 

我search了Jasmine API,但找不到哪个版本是正确的。 我发现的所有例子似乎都使用第二个版本。

茉莉花的API最近改变了吗? 我怎样才能写我的testing,所以它总是工作?

是的,间谍API从茉莉花1.3.1更改为茉莉花2.0。 没有“正确的”版本。 如果你能findJasmine 2.0的工具支持,我会build议升级。

茉莉花1.3.1语法( 文档 )

 spyOn(mBankAccountResource, 'getBankAccountData').andCallFake(fakedFunction); expect(mBankAccountResource.getBankAccountData.mostRecentCall.args).toEqual(["foo"]); 

Jasmine 2.0语法( 文档 )

 // 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"]); 

我提到工具支持,因为这似乎是你遇到的问题。 茉莉花2.0只出现了几个月(在撰写本文时)。 相比之下,对Karma的Jasmine 2.0的支持已经出现了几个星期(我不确定其他工具)。

要解决您的问题,请调查您正在使用哪个工具来运行testing,并查看是否有任何支持Jasmine 2.0。 如果他们都这样做,那么去升级。 否则,将您的浏览器testing降级到Jasmine 1.3.1,并等到工具支持更好。 只要确保你全面一致。