Dan*_*iel 1 mocha.js sinon angularjs chai bardjs
我正在编写一个角度控制器,它对数据服务有依赖性(数据服务转到http服务器),我想模仿它的行为.
我正在使用一个名为bard js的库进行模拟,它有一个名为bard.mockService的模拟服务api .
在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();
});
Run Code Online (Sandbox Code Playgroud)
然后我的测试:
it('should call create process data service to create process', function() {
controller.create();
expect(processCreationDataservice.createProcess).to.have.been.calledOnce;
});
Run Code Online (Sandbox Code Playgroud)
正如您在测试中看到的那样,我想声明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() {
};
}})();
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这个测试正在通过,我该怎么做才能断言该方法被调用一次.
我按照这些说明操作:https: //github.com/wardbell/bardjs#mockService
我相信你忽略了加载sinon-chai脚本.您可以通过在您加载sinon.js的下方的specs.html中粘贴以下内容来快速找到答案
<script src="https://rawgithub.com/domenic/sinon-chai/master/lib/sinon-chai.js"></script>
Run Code Online (Sandbox Code Playgroud)
我通常会通过npm 拉下sinon-chai
Run Code Online (Sandbox Code Playgroud)npm install sinon-chai --save-dev然后我的脚本变成......
Run Code Online (Sandbox Code Playgroud)<script src="/node_modules/sinon-chai/lib/sinon-chai.js"></script>
我敢打赌你的测试失败了,完全如你所料.
遗漏了sinon-chai导致了一个非常微妙的误报.像我解释的那样关注我:
让我们在你说"calledOnce"之前看一下断言/期望:
expect(processCreationDataservice.createProcess).to.have.been; // Assertion
Run Code Online (Sandbox Code Playgroud)
它返回一个柴Assertion.但是这个Assertion对象缺乏所有的sinon断言方法,例如calledOnce.该兴农齐库扩展薛宝钗与兴农断言方法.
因此,当你calledOnce坚持到底时,你得到:
expect(processCreationDataservice.createProcess).to.have.been.calledOnce; // undefined
Run Code Online (Sandbox Code Playgroud)
是的,声明返回undefined...这是对摩卡没有任何影响的惰性陈述.这不是错误.这只是一个无操作.所以expect什么也没做,摩卡认为测试通过了.
您可能也这样做了(它也通过了):
expect(processCreationDataservice.foo /*undefined*/).to.have.been.calledOnce; // undefined
Run Code Online (Sandbox Code Playgroud)
你不必使用"sinon-chai".这很方便.但如果你把它留下来,你就必须这样写出期望:
// without "sinon-chai"
expect(dataservice.createThing.calledOnce).to.be.true;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2601 次 |
| 最近记录: |