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%确定这是否值得。这是一个学习技术的实验。