我有一个基本模型,我正在尝试编写一个简单的单元测试套件,而且我显然错过了一些东西......
模型的代码如下所示:
angular.module('AboutModel', [])
.factory(
'AboutModel',
[
function () {
var paragraphs = [];
var AboutModel = {
setParagraphs: function (newParagraphs) {
paragraphs = newParagraphs;
},
getParagraphs: function () {
return paragraphs;
}
};
return AboutModel;
}
]
);
要求很简单:为名为paragraphs
的私有数组提供getter和setter方法。
就测试套件代码而言,这就是我所拥有的:
describe('Testing AboutModel:', function () {
describe('paragraphs setter', function () {
beforeEach(module('AboutModel'));
it('sets correct value', inject(function (model) {
// STUCK HERE
// don't know how to access the model, or the setParagraphs() method
}));
});
describe('paragraphs getter', function () {
// not implemented yet
});
});
我一直在网上进行相当多的谷歌研究,但到目前为止还没有快乐。
解决方案必须简单;请帮忙!
甚至可能会出现更好的实施模式的方法......愿意接受更好的建议。
对于任何感兴趣的人,完整的源代码在这里: https://github.com/mcalthrop/profiles/tree/imp/angular
提前致谢
马特
答案 0 :(得分:4)
您需要在测试中运行beforeEach以注入模型实例,然后将其分配给变量,然后您可以在测试中重复使用该变量。
var AboutModel;
beforeEach(inject(function (_AboutModel_) {
AboutModel = _AboutModel_;
}));
然后你可以这样访问你的getter:
AboutModel.getParagraphs();
我稍微调整了原始模型,因为我觉得它看起来好一点(我的偏好):
'use strict';
angular.module('anExampleApp')
.factory('AboutModel', function () {
var _paragraphs;
// Public API here
return {
setParagraphs: function (newParagraphs) {
_paragraphs = newParagraphs;
},
getParagraphs: function () {
return _paragraphs;
}
};
});
然后进行测试我将使用标准Jasmine测试和spies的组合:
'use strict';
describe('Service: AboutModel', function () {
beforeEach(module('anExampleApp'));
var AboutModel, paragraphs = ['foo', 'bar'];
beforeEach(inject(function (_AboutModel_) {
AboutModel = _AboutModel_;
}));
it('should set new paragraphs array', function () {
AboutModel.setParagraphs([]);
expect(AboutModel.getParagraphs()).toBeDefined();
});
it('should call setter for paragraphs', function () {
spyOn(AboutModel, 'setParagraphs');
AboutModel.setParagraphs(paragraphs);
expect(AboutModel.setParagraphs).toHaveBeenCalledWith(paragraphs);
});
it('should get 2 new paragraphs', function () {
AboutModel.setParagraphs(['foo', 'bar']);
expect(AboutModel.getParagraphs().length).toEqual(2);
});
});