我正在编写一个角度控制器,它对数据服务有依赖性(数据服务转到http服务器),我想嘲笑它的行为。
我正在使用一个名为bard js的库进行模拟,它有一个api来模拟服务,名为 bard.mockService 。
在beforeEach声明中我正在做:
beforeEach(function() {
bard.appModule('app.process.creation');
bard.inject('$controller', '$rootScope', '$q', 'processCreationDataservice');
bard.mockService(processCreationDataservice, {
createProcess: $q.when({}),
_default: $q.when([])
});
controller = $controller('ProcessCreationController');
$rootScope.$apply();
});
然后我的测试:
it('should call create process data service to create process', function() {
controller.create();
expect(processCreationDataservice.createProcess).to.have.been.calledOnce;
});
正如您在测试中所看到的,我想断言dataservice.createProcess被调用一次。
控制器没有调用processCreationDataservice.createProcess方法,测试仍在传递。
(function() {
angular
.module('app.process.creation')
.controller('ProcessCreationController', ProcessCreationController);
ProcessCreationController.$inject = ['processCreationDataservice'];
function ProcessCreationController(processCreationDataservice) {
var vm = this;
vm.process = {
name: '',
bankId: ''
};
vm.create = function() {
};
}})();
我想知道为什么这个测试正在通过,我该怎么做才能断言该方法被调用一次。
答案 0 :(得分:5)
我相信你忽略了加载 sinon-chai 脚本。您可以通过在 sins.js 下面的 specs.html 中粘贴以下内容来快速找到答案 sinon.js
<script src="https://rawgithub.com/domenic/sinon-chai/master/lib/sinon-chai.js"></script>
我通常会通过npm
拉下 sinon-chainpm install sinon-chai --save-dev
然后我的脚本变成......
<script src="/node_modules/sinon-chai/lib/sinon-chai.js"></script>
我敢打赌你的测试失败了,就像你期望的那样。
遗漏 sinon-chai 会导致非常微妙的误报。像我解释的那样跟着我:
让我们在你说“calledOnce”之前看一下断言/期望:
expect(processCreationDataservice.createProcess).to.have.been; // Assertion
它返回一个chai Assertion
。但是Assertion
对象缺少所有的sinon断言方法,例如calledOnce
。 sinon-chai 库使用sinon断言方法扩展 chai 。
因此,当你将calledOnce
发送到最后时,你会得到:
expect(processCreationDataservice.createProcess).to.have.been.calledOnce; // undefined
是的,语句返回undefined
...这是对mocha无关的惰性语句。这不是错误。这只是一个无操作。所以expect
什么也没做,摩卡认为测试通过了。
你可能也这样做了(它也通过了):
expect(processCreationDataservice.foo /*undefined*/).to.have.been.calledOnce; // undefined
你 不必使用“sinon-chai” 。这很方便。但如果你把它留下来,你就必须这样写出期望:
// without "sinon-chai"
expect(dataservice.createThing.calledOnce).to.be.true;
我为你(和其他人)创建a plunker来探索这些动态。
答案 1 :(得分:-3)
这不是一个我不认为的答案,只是一个问题。当角度内置http
时,为什么会引入第三方service
模拟$httpBackend
?如果这是一个有意识的决定,是什么让你去做?