使用bard js模拟dataservice

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

War*_*ard 5

我相信你忽略了加载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

npm install sinon-chai --save-dev
Run Code Online (Sandbox Code Playgroud)

然后我的脚本变成......

<script src="/node_modules/sinon-chai/lib/sinon-chai.js"></script>
Run Code Online (Sandbox Code Playgroud)

我敢打赌你的测试失败了,完全如你所料.

遗漏了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)

我为你(和其他人)创造了一个探索这些动态的探索者.