3

我有一个基本模型,我正在尝试为其编写一个简单的单元测试套件,但我显然遗漏了一些东西......

该模型的代码如下所示:

angular.module('AboutModel', [])
    .factory(
        'AboutModel',
        [
            function () {
                var paragraphs = [];
                var AboutModel = {
                    setParagraphs: function (newParagraphs) {
                        paragraphs = newParagraphs;
                    },
                    getParagraphs: function () {
                        return paragraphs;
                    }
                };

                return AboutModel;
            }
        ]
    );

要求很简单:为名为 的私有数组提供一个 getter 和一个 setter 方法paragraphs

这是我对测试套件代码的了解:

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

提前致谢

马特

4

1 回答 1

4

您需要在测试中运行 beforeEach 以注入模型实例,然后将其分配给一个变量,然后您可以在整个测试中重复使用该变量。

var AboutModel;

beforeEach(inject(function (_AboutModel_) {
  AboutModel = _AboutModel_;
}));

然后,您可以像这样访问您的吸气剂:

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 测试和间谍的组合:

'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);
  });

});
于 2013-06-27T12:37:43.037 回答