用 bard js 模拟数据服务
mocking dataservice with bard js
我正在编写一个 angular 控制器,它依赖于数据服务(数据服务转到 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() {
};
}})();
我想知道为什么这个测试通过了,我应该怎么做才能断言该方法被调用了一次。
这不是我不认为的真正答案,只是一个问题。当 angular 内置了 $httpBackend
时,为什么要引入第 3 方 http
模拟 service
?如果这是一个有意识的决定,是什么让你这么做的?
我相信您忽略了加载 sinon-chai 脚本。您可以通过将以下内容粘贴到您的 specs.html 中,就在您加载 sinon.js[=25= 的下方]
<script src="https://rawgithub.com/domenic/sinon-chai/master/lib/sinon-chai.js"></script>
I typically pull down sinon-chai via npm
npm install sinon-chai --save-dev
and then my script becomes ...
<script src="/node_modules/sinon-chai/lib/sinon-chai.js"></script>
我敢打赌你的测试会失败,正如你所期望的那样。
sinon-chai 的遗漏导致非常微妙 误报。按照我的解释跟随我:
让我们看看你说 "calledOnce" 之前的 assertion/expectation:
expect(processCreationDataservice.createProcess).to.have.been; // Assertion
它returns一个柴Assertion
。但是 Assertion
对象 缺少所有 sinon 断言方法 ,例如 calledOnce
。 sinon-chai 库使用 sinon 断言方法扩展了 chai。
因此,当您将 calledOnce
添加到末尾时,您会得到:
expect(processCreationDataservice.createProcess).to.have.been.calledOnce; // undefined
是的,语句 returns undefined
... 这是一个对 mocha 没有影响的惰性语句。这不是错误。这只是一个空操作。所以 expect
什么都不做,mocha 认为测试通过了。
你不妨这样做(它也通过了):
expect(processCreationDataservice.foo /*undefined*/).to.have.been.calledOnce; // undefined
您不必使用"sinon-chai"。这是一个方便。但是,如果您将其遗漏,则必须这样写期望:
// without "sinon-chai"
expect(dataservice.createThing.calledOnce).to.be.true;
我为您(和其他人)创建了 a plunker 来探索这些动态。
我正在编写一个 angular 控制器,它依赖于数据服务(数据服务转到 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() {
};
}})();
我想知道为什么这个测试通过了,我应该怎么做才能断言该方法被调用了一次。
这不是我不认为的真正答案,只是一个问题。当 angular 内置了 $httpBackend
时,为什么要引入第 3 方 http
模拟 service
?如果这是一个有意识的决定,是什么让你这么做的?
我相信您忽略了加载 sinon-chai 脚本。您可以通过将以下内容粘贴到您的 specs.html 中,就在您加载 sinon.js[=25= 的下方]
<script src="https://rawgithub.com/domenic/sinon-chai/master/lib/sinon-chai.js"></script>
I typically pull down sinon-chai via npm
npm install sinon-chai --save-dev
and then my script becomes ...
<script src="/node_modules/sinon-chai/lib/sinon-chai.js"></script>
我敢打赌你的测试会失败,正如你所期望的那样。
sinon-chai 的遗漏导致非常微妙 误报。按照我的解释跟随我:
让我们看看你说 "calledOnce" 之前的 assertion/expectation:
expect(processCreationDataservice.createProcess).to.have.been; // Assertion
它returns一个柴Assertion
。但是 Assertion
对象 缺少所有 sinon 断言方法 ,例如 calledOnce
。 sinon-chai 库使用 sinon 断言方法扩展了 chai。
因此,当您将 calledOnce
添加到末尾时,您会得到:
expect(processCreationDataservice.createProcess).to.have.been.calledOnce; // undefined
是的,语句 returns undefined
... 这是一个对 mocha 没有影响的惰性语句。这不是错误。这只是一个空操作。所以 expect
什么都不做,mocha 认为测试通过了。
你不妨这样做(它也通过了):
expect(processCreationDataservice.foo /*undefined*/).to.have.been.calledOnce; // undefined
您不必使用"sinon-chai"。这是一个方便。但是,如果您将其遗漏,则必须这样写期望:
// without "sinon-chai"
expect(dataservice.createThing.calledOnce).to.be.true;
我为您(和其他人)创建了 a plunker 来探索这些动态。