Angularjs 带$state的变量-Jasmine测试

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

首先,直到几个月前我才见过安格尔和茉莉花。所以我花了两三个月的时间在一家公司的实践中研究这个问题,最后他们派我去用VisualStudio代码测试一个控制器/服务

控制器中有一个变量:

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,我现在想为这最后一个愚蠢的错误哭泣。我非常感谢你的帮助,我不知道如何正确地感谢你。非常感谢你,我必须承认,现在我对这件事有了更多的了解。