Angularjs 带$state的变量-Jasmine测试
首先,直到几个月前我才见过安格尔和茉莉花。所以我花了两三个月的时间在一家公司的实践中研究这个问题,最后他们派我去用VisualStudio代码测试一个控制器/服务 控制器中有一个变量:Angularjs 带$state的变量-Jasmine测试,angularjs,unit-testing,jasmine,Angularjs,Unit Testing,Jasmine,首先,直到几个月前我才见过安格尔和茉莉花。所以我花了两三个月的时间在一家公司的实践中研究这个问题,最后他们派我去用VisualStudio代码测试一个控制器/服务 控制器中有一个变量: vm.option = $state.param.option; function MyController($state) { this.option = $state.params.option ... } 在spec.js中,我创建了一个it: it('"option" should b
vm.option = $state.param.option;
function MyController($state) {
this.option = $state.params.option
...
}
在spec.js中,我创建了一个it
:
it('"option" should be defined', function () {
expect(ctrl.option).toBeDefined();
});
以前,我在每个a$controller
、$rootScope
、$log
、$injector
和服务之前插入。我需要一些特殊的东西来测试这个变量?我尝试注入\u$state\uuu
,但消息预期未定义
也出现了
我感谢所有的帮助,并为我糟糕的英语感到抱歉
编辑:
规范js:
'use strict';
describe('app/specs/spec.js', function () {
var scope, $log, service, ctrl, state/*, testedStateExample*/;
beforeAll(function () {} );
beforeEach(angular.mock.module('App.moduleExample'));
beforeEach(function () {
module(function ($provide){
$provide.constnt('APP_CONFIG', {});
});
});
beforeEach(angular.mock.inject(function ($controller, $state, $rootScope, _$log_, _service_){
service = _service_;
scope = $rootScope.$new();
$log = _$log_;
$state = $state;
state = { params: { option: 'E' }}
ctrl = $controller('controllerExample', {
$scope: scope,
service: service,
$log: $log
});
//testedStateExample = new ctrl(state);
});
it('"option" should be defined', function () {
expect(state.params).toBeDefined();
});
});
控制器中存在输入错误:$state
没有param
属性,但params
。
此外,您还必须在测试中对注入的$state
对象定义params.option
,因为在注入的$state
中,它没有设置,因此控制器无法从$state
读取它,但如何执行取决于您的代码详细信息state.params
是根据URL和路由配置设置的,但当您测试独立控制器时,没有URL或路由配置,因此,$state.params
为空。
解决问题的最佳方法是模拟注入的$state
:
假设您有以下控制器:
vm.option = $state.param.option;
function MyController($state) {
this.option = $state.params.option
...
}
在测试规范中,您可以模拟$state
服务,并将此模拟作为参数传递给控制器:
var mockState = {
params: {
option: 'TEST'
}
}
var testedControllerInstance = new MyController(mockState)
}
...
expect(testedControllerInstance.option).toBe('TEST');
根据更新的问题回答更新:
您忘记将状态
注入控制器:
beforeEach(angular.mock.inject(function ($controller, $state, rootScope, _$log_, _service_){
service = _service_;
scope = $rootScope.$new();
$log = _$log_;
var state = { params: { option: 'E' }}
ctrl = $controller('controllerExample', {
$scope: scope,
service: service,
$log: $log,
$state: state
});
});
...
})
) 它在ctrl上出错-您将其定义为什么?我在这里定义了ctrl:beforeach(angular.mock.inject(函数(/*params*/){service=\u service;scope=$rootScope.$new();$log=\u$log;$state=\u$state;ctrl=$controller('service',{$scope:scope,service:service,$log:$state:$state})
注释失败,我现在编辑。xDDDDUhm…我希望能很好地理解你(我觉得太新手了:(()。我注入了$state
,现在也注入了$stateParams
。当你注入一些东西时,你必须在变量中定义它,对吗?我需要确认我理解这一点(对不起).我在spec.js中定义了一个名为stateExample
和testedStateExample
的变量,并在beforeach(我在其中定义了ctrl)中给出了与您的示例类似的值。更改后,expect
类型错误:'[object object]'不是构造函数。
。呃,这看起来很简单,但当我这么做的时候,我的生活就复杂了。如果没有testedStateExample
没有失败,但我认为不要使用$state,对吗?请用整个相关代码(整个控制器和控制器测试)更新你的问题是的,更好…我添加了spec.js,但现在我无法教控制器(他们需要我的电脑。)Pff,我现在想为这最后一个愚蠢的错误哭泣。我非常感谢你的帮助,我不知道如何正确地感谢你。非常感谢你,我必须承认,现在我对这件事有了更多的了解。