Javascript 为什么';我的角度测试$scope是否定义了方法?

Javascript 为什么';我的角度测试$scope是否定义了方法?,javascript,angularjs,dependency-injection,requirejs,jasmine,Javascript,Angularjs,Dependency Injection,Requirejs,Jasmine,出于某种原因,我正在注入的作用域没有被填充,实际上这可能有点明显,一个console.log语句揭示了在测试运行之后控制器才真正被执行,但我不确定为什么或者如何修复它更新:,我转储了Insert,它似乎是一个空对象,这可能不是正确的事情 define([ 'angular-mocks', 'controllers/insert'], function( mocks ) { 'use strict'; describe('Controller: Insert', function () {

出于某种原因,我正在注入的作用域没有被填充,实际上这可能有点明显,一个
console.log
语句揭示了在测试运行之后控制器才真正被执行,但我不确定为什么或者如何修复它更新:,我转储了
Insert
,它似乎是一个空对象,这可能不是正确的事情

define([
'angular-mocks',
'controllers/insert'],
function( mocks ) {
'use strict';

describe('Controller: Insert', function () {
    // load the controller's module
    beforeEach(module('pasteyApp'));

    var Insert,scope,location,pastes;

    // Initialize the controller and a mock scope
    beforeEach(inject(function ( $injector, $controller, $rootScope ) {
        pastes     = $injector.get('pastes');
        location   = $injector.get('$location');
        scope      = $rootScope.$new();
        scope.code = 'package Foo::Bar;',
        Insert     = $controller('Insert', {
            $scope:    scope,
            $location: location,
            pastes:    pastes,
        });
    }));


    it('has code', function () {
        expect( scope.code ).toBe('package Foo::Bar;');
        scope.$apply();
    });

    it('updates location', function () {
        scope.view();
        expect( location.path() ).not.toBe('');
        expect( location.path() ).toBe('...');
        expect( pastes ).toBe( {} );
    });
});

});
conroller/insert

define([
'crypto.MD5',
'angular',
'services',
], function() {
'use strict';

return ['$scope', '$location', 'pastes', function ( $scope, $location, pastes ) {
    $scope.view = function( ) {
        if ( $scope.code ) {
            // boo hex, really want urlsafe base64
            var digest = Crypto.MD5( $scope.code ).toString();
            console.log( digest );
            pastes[digest] = $scope.code;
        }
        $location.path( digest );
    };
}];
});
控制器

define([
    'app',
    'services',
], function ( app ) {
    'use strict';


    return app
            .controller('Insert', ['$scope','$injector', function( $scope, $injector ) {
                    require(['controllers/insert'], function( insert ) {
                            $injector.invoke( insert, this, { '$scope': $scope });
                    })
            }])
            .controller('Render', ['$scope','$injector', function( $scope, $injector ) {
                    require(['controllers/render'], function( render ) {
                            $injector.invoke( render, this, { '$scope': $scope });
                    });
            }])
            ;
});
实际误差

Chrome 31.0.1650 (Linux) Controller: Insert updates location FAILED
    TypeError: Object #<Scope> has no method 'view'
        at null.<anonymous>   (/home/xenoterracide/dev/Pastey/test/spec/controllers/insert.js:33:10)
Chrome 31.0.1650(Linux)控制器:插入更新位置失败 TypeError:对象#没有方法“视图” 在空。(/home/xenoterracide/dev/Pastey/test/spec/controllers/insert.js:33:10)
我想我理解你的问题。由于
require()
是异步的,而您的Jasmine测试不是,所以在运行规范时,“require/insert”函数尚未执行。您需要在Jasmine中找到一种方法,在执行
it()
块之前等待require完成

这就是为什么控制器是一个对象,但它上还不存在任何东西。很明显,您正在正确注册所有内容(否则,
$controller()
将抛出),但等待require.js完成其工作的时间不够长


看来我能很好地处理你需要做的事情。

我想我理解你的问题。由于
require()
是异步的,而您的Jasmine测试不是,所以在运行规范时,“require/insert”函数尚未执行。您需要在Jasmine中找到一种方法,在执行
it()
块之前等待require完成

这就是为什么控制器是一个对象,但它上还不存在任何东西。很明显,您正在正确注册所有内容(否则,
$controller()
将抛出),但等待require.js完成其工作的时间不够长


看起来你能很好地处理你需要做的事情。

我没有看到任何调用
angular.controller('Insert',…)
@BrianGenisio添加了我的
controllers.js
谢谢。现在,我没有看到在测试的需求链中需要“控制器”的地方。我看到它需要“controllers/insert”,但是调用注册控制器的
app.controller
代码的测试在哪里?我没有看到调用
angular.controller('insert',…)
@BrianGenisio添加了我的
controllers.js
谢谢。现在,我没有看到在测试的需求链中需要“控制器”的地方。我看到它需要“controllers/insert”,但是调用注册控制器的
app.controller
代码的测试在哪里?是否应该定义依赖项以确保脚本都已加载?尝试使用
run()
包装失败OK,
wait(100)
在工作结束前,我想在
开始时它也会()
可能已加载,但
require()
将是异步的,以避免操作顺序错误。如果确实加载了内容,则
wait(0)
可能也会起作用。。。足以让事件循环通过其挂起的操作。但是,如果您仍在等待下载该文件,那么
wait(100)
可能会导致计时测试失败。作为旁注,我想知道将require.js与Angular一起使用有什么好处。Angular已经有了一个模块系统,require.js增加了一层复杂性,我不理解它的好处。我当然可能遗漏了一些东西,但我只是不理解它们的组合。可能是异步脚本加载,但我也不是100%确定这是否值得。这是一个学习技术的实验。定义依赖项不应该确保所有脚本都已加载吗?尝试使用
run()
包装失败OK,
wait(100)
在工作结束前,我想在
开始时它也会()
可能已加载,但
require()
将是异步的,以避免操作顺序错误。如果确实加载了内容,则
wait(0)
可能也会起作用。。。足以让事件循环通过其挂起的操作。但是,如果您仍在等待下载该文件,那么
wait(100)
可能会导致计时测试失败。作为旁注,我想知道将require.js与Angular一起使用有什么好处。Angular已经有了一个模块系统,require.js增加了一层复杂性,我不理解它的好处。我当然可能遗漏了一些东西,但我只是不理解它们的组合。可能是异步脚本加载,但我也不是100%确定这是否值得。这是一个学习技术的实验。