变量与$ state - Jasmine Test

时间:2017-02-08 09:05:42

标签: angularjs unit-testing jasmine

首先,我几个月前才见过Angular和Jasmine。所以我花了两三个月的时间在公司的实践中研究这个,最后他们让我尝试在Visual Studio Code中测试一个控制器/服务。

我在控制器中有这个变量:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis-jaxrpc</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis-saaj</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>axis</groupId>
    <artifactId>axis-wsdl4j</artifactId>
    <version>1.5.1</version>
</dependency>

<dependency>
    <groupId>axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>

在spec.js中,我创建了一个vm.option = $state.param.option;

it

以前,我在it('"option" should be defined', function () { expect(ctrl.option).toBeDefined(); }); beforeEach$controller$rootScope_$log_和服务中注入了$injector。我需要一些特殊的东西来测试这个变量吗我尝试了注入_$state_,但也显示了消息Expected undefined to be defined

我感谢所有的帮助,对不起我的英语不好。

编辑:

spec.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();
 });
});

1 个答案:

答案 0 :(得分:0)

您的控制器中存在拼写错误:-Wformat没有$state属性,但param。 此外,您还必须在测试中对注入的params对象定义params.option,因为在注入的$state中它没有设置,因此您的控制器无法从中读取它$state - 但如何执行此操作取决于您的代码详细信息。 $state是根据URL和路由配置设置的,但是当您测试独立控制器时,没有URL也没有路由配置,因此state.params为空。 解决问题的最佳方法是模拟注入$state.params: 让我们说你有以下控制器:

$state

在您的测试规范中,您可以模拟function MyController($state) { this.option = $state.params.option ... } 服务并将此模拟作为参数传递给您的控制器:

$state

根据更新的问题回答更新:

您已忘记将var mockState = { params: { option: 'TEST' } } var testedControllerInstance = new MyController(mockState) } ... expect(testedControllerInstance.option).toBe('TEST'); 注入您的控制器:

state