1

我正在编写一个角度控制器,它依赖于数据服务(数据服务转到 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();
});

然后我的测试:

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() {

    };
}})();

我想知道为什么这个测试通过了,我应该怎么做才能断言该方法被调用了一次。

我按照以下说明操作: https ://github.com/wardbell/bardjs#mockService

4

2 回答 2

5

我相信您忽略了加载sinon-chai脚本。您可以通过将以下内容粘贴到您加载sinon.js的下方的specs.html中来快速找到

<script src="https://rawgithub.com/domenic/sinon-chai/master/lib/sinon-chai.js"></script>

我通常通过 npm拉下sinon-chai

npm install sinon-chai --save-dev

然后我的脚本变成...

<script src="/node_modules/sinon-chai/lib/sinon-chai.js"></script>

我敢打赌你的测试会失败,正如你所期望的那样。

sinon-chai的省略导致了一个非常微妙的误报。按照我的解释跟随我:

让我们看看在你说“被调用”之前的断言/期望:

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;

我为您(和其他人)创建了一个 plunker来探索这些动态。

于 2015-06-30T01:24:41.987 回答
-3

我认为这不是一个真正的答案,只是一个问题。当 Angular内置时,你为什么要引入 3rd party httpmock ?如果这是一个有意识的决定,是什么让你去做?service$httpBackend

于 2015-06-26T01:00:56.657 回答