0

GET リクエストが正しい量の項目を返すかどうかを確認する単体テストを作成しようとしていますが、これを行うためにモック データを使用しています。

私のテストは次のようになります。

test.js

describe('Customer Controller', function () {
    var controller;
    var customers = mockData.getMockCustomers(); // fake customers (5 customers)

    beforeEach(function() {
      bard.appModule('app');
      bard.inject('$controller', '$q', '$rootScope');

      var cs = {
        getCustomers: function() {
          return $q.when(customers);
        }
      };

      controller = $controller('customersCtrl', {
        CustomerService: cs
      });
    });

    it('should return 5 customers', function() {
      $rootScope.$apply();
      expect(controller.customers).to.have.length(5);
    });
});

テストを実行すると、次のエラーが発生し続けます。

TypeError: 未定義のプロパティ '長さ' を読み取ることができません

何らかの理由でcontroller.customers戻ってくるようです。undefinedデータを正しくモックしていますか?

私はこれに非常に慣れていないので、何が間違っているのかわかりません。そのような問題をデバッグする方法さえ知りません。

どんな助けでも大歓迎です。前もって感謝します!

アップデート

私のコントローラーは次のようになります。

function customersCtrl(dataservice) {
  var vm = this;
  vm.customers = [];

  fetchCustomers();

  function fetchCustomers() {
    return dataservice.getCustomers()
    .then(function(data) {
      vm.customers = data.data;
      return vm.customers ;
    });
  }
}

更新 2

テストに console.log を入れたところ、customers 変数が空のように見える 5 つのオブジェクトを返しています。おそらくこれが問題ですか?

ここに画像の説明を入力

4

2 に答える 2

0

$httpBackend を調べましたか? 単体テストは、期待どおりの場合、実際にはデータベースにヒットしません。独自の応答をモックアップする必要があります。

すなわち:

$httpBackend.whenGET(/MyEndPoint).respond([{}, {}, {}]);

次に、3の長さまたは必要なものをテストできます

于 2015-11-22T21:14:12.147 に答える
0

新しい答え、シノンスパイの使用をお勧めします

chai と sinon を使用して、いくつかのノード テストに mocha を使用します。これは、sinon スタブを使用した例です。

var sinon = require('sinon');

describe('Customer Controller', function () {
        var controller;
        var customers = mockData.getMockCustomers(); // fake customers (5 customers)

    beforeEach(function() {
      bard.appModule('app');
      bard.inject('$controller', '$q', '$rootScope');

      var deferred = $q.defer();
      deferred.resolve(customers);
      var cs = {
         fetchCustomers: sinon.stub().returns(deferred.promise)
      };

      controller = $controller('scoreListCtrl', {
        CustomerService: cs
      });
    });

    it('should return 5 customers', function() {
      $rootScope.$apply();
      expect(controller.customers).to.have.length(5);
    });
});

以下の元の回答、ジャスミンスパイの使用をお勧めします

ジャスミンスパイを使ったことはありますか?私はそれらを使用します。これはおそらくコピーアンドペーストの回答ではありませんが、一般的な方向性を示すはずです.

describe('Customer Controller', function () {
    var controller;
    var customers = mockData.getMockCustomers(); // fake customers (5 customers)

    beforeEach(function() {
      bard.appModule('app');
      bard.inject('$controller', '$q', '$rootScope');

      var cs = {};
      var deferred = $q.defer();
      deferred.resolve(customers);
      spyOn(cs, 'fetchCustomers').and.returnValue(deferred.promise);

      controller = $controller('scoreListCtrl', {
        CustomerService: cs
      });
    });

    it('should return 5 customers', function() {
      $rootScope.$apply();
      expect(controller.customers).to.have.length(5);
    });
});

jasmine スパイの詳細については、 http ://jasmine.github.io/2.0/introduction.html をご覧ください。

于 2015-11-22T21:55:48.450 に答える