web-dev-qa-db-ja.com

angularモック `モジュール`は '[オブジェクトオブジェクト]は関数ではありません'になります

Angular Teaspoonで実行されているJasmineを使用していくつかの単体テストを作成しようとしています。テストは実行中ですが、失敗しているコントローラーの存在をテストするだけの簡単なテストがあります。次のテスト設定があります。

//= require spec_helper

require("angular");
require("angular-mocks");
var app = require("./app");


describe("My App", function() {

  describe("App Controllers", function() {

    beforeEach(module("app"))

    it("Should have created an application controller", inject(function($rootScope, $controller){
      var scope = $rootScope.$new();
      ctrl = $controller("ApplicationCtrl", { $scope: scope });
    }));

  })

})

Requireステートメントは、依存関係を処理しているBrowserifyによって処理されますが、スペックヘルパーに使用しているスプロケットにフックすることもできます。

必要なアプリの中に、

require("angular");
var controllers = require("./controllers");

var app = angular.module("app", [
  "app.controllers"
]);

exports.app = app;

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

Failure/Error: TypeError: '[object Object]' is not a function (evaluating 'module("aialerts")')

私はこれを理解するためにかなりの時間を費やしましたが、何が起こっているのか分かりません。助けてくれてありがとう。

25
PaReeOhNos

同じ問題がありました。この行を変更します。

beforeEach(module("app"))

に:

beforeEach(angular.mock.module("app"))
83
zayquan

Browserifyはノードスタイルのrequireを使用します。ここで、moduleは機能をエクスポートするために使用できるオブジェクトです。

console.log(module); // {exports: {}}

angular-mocks.jsは関数をwindow.moduleにアタッチしようとしますが、それはBrowserify/Nodeでは不可能です。

angular-mocks source を見ると、angular-mocksもmodule関数をangular.mockにアタッチしているようです。したがって、グローバルmoduleオブジェクトを使用する代わりに、angular.mock.moduleを使用する必要があります。

24
yndolok