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 テストと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);
  });

});
于 2013-06-27T12:37:43.037 に答える