2014-01-07 74 views
25

我想创建一些使用茉莉正在茶匙运行的单元测试。测试正在运行,但是我有一个简单的测试来测试失败的控制器的存在。我有以下测试设置。角模拟`模块`导致'[对象对象]不是函数'

//= 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处理,但我也可以挂钩到我用于spec助手的链接。

正被要求在应用程序中,我有

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")') 

我花了很长一段时间试图弄清楚这个,但我不知道发生了什么事。任何帮助赞赏。

+0

是'变种应用=需要( “./应用”);'加载角'app'模块? – dcodesmith

+0

是的。我刚刚发布了该文件的内容:) – PaReeOhNos

+0

我不知道有关browserify和那种奇怪的东西。但是没有必要以这种方式在测试中加载你的应用程序(当然,根据我对browserify的一点经验)。要求退出会发生什么? –

回答

80

我有同样的问题。改变这一行:

beforeEach(module("app")) 

到:

beforeEach(angular.mock.module("app")) 
+1

angular.mock.module是足够的,没有必要把它之前的窗口 – Capaj

+0

还没有能够测试这个我改变了工作,但我认为它是正确的,并且工作 – PaReeOhNos

+1

如果您在测试中使用严格模式,那么添加'window'前缀不会起作用。就像其他人说的那样,只需要用'angular.mock'作为前缀。 – demisx

24

Browserify采用节点式require,其中module是一个对象,你可以用它来导出功能:

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

角mocks.js尝试将功能附加到window.module,但这是不可能的Browserify /节点。

看看angular-mocks source,看起来angular-mocks还会将module函数附加到angular.mock。因此,而不是使用全局module对象,您必须使用angular.mock.module