如何为AngularJS模型编写单元测试

时间:2013-06-27 11:31:18

标签: unit-testing angularjs jasmine karma-runner

我有一个基本模型,我正在尝试编写一个简单的单元测试套件,而且我显然错过了一些东西......

模型的代码如下所示:

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

提前致谢

马特

1 个答案:

答案 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);
  });

});