javascript - 在 jasmine 指令 Controller 中返回一个 promise

标签 javascript angularjs jasmine karma-jasmine

在我的单元测试中,我需要返回一个 promise ,以便我的测试不会失败:

describe('refugeeRegister', function () {

  var controller, scope, rootScope, window;

  beforeEach(function () {
    module('refugeeHire');
    module("templates");
    module('refugeeHire.components.refugee_register', function ($provide) {
      $provide.service("authenticationService", function () {
        this.signup = jasmine.createSpy("signup").and.returnValue();
        this.getCookie=jasmine.createSpy("getCookie");
      });
    });

  });

  beforeEach(inject(function ($rootScope, $compile) {
    el = angular.element("<refugee-register></refugee-register>");
    $compile(el)($rootScope.$new());
    $rootScope.$digest();

    rootScope = $rootScope;

    controller = el.controller("refugeeRegister");

    scope = el.isolateScope() || el.scope();

  }));

  it("should have initialized variables", function () {
    expect(scope.vm).toBeDefined();
  });

  it("should register a user", function () {
    scope.register();
    expect(rootScope.globals.loading).toBe(true);
    expect(authenticationService.signup).toHaveBeenCalled();
  });

});

它应该测试这个模块(使用 Controller 内部的逻辑):

function refugeeRegister() {
        var directive = {
          restrict: 'E',
          templateUrl: 'components/register/refugee/refugee_register.html',
          scope: {},
          controller: refugeeRegisterController,
          controllerAs: 'vm',
          bindToController: true
        };

测试错误如下:

TypeError: undefined is not an object (evaluating 'authenticationService.signup($scope.vm, "REFUGEE").then') in /Users/fabianlurz/refugeehire/app/components/register/refugee/refugee_register.js (line 73)
    register@/Users/fabianlurz/refugeehire/app/components/register/refugee/refugee_register.js:73:60
    /Users/fabianlurz/refugeehire/app/components/register/refugee/refugee_register-spec.js:35:19
PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 4 of 4 (1 FAILED) (0.004 secs / 0.407 secs)

那么我如何在我的mockService(authenticationService)中返回一个 promise ?

最佳答案

对于硬编码静态分辨率,可能是

this.signup = jasmine.createSpy("signup").and.returnValue($q.resolve('...');

对于动态解析,应在每次调用时发出新的 promise :

this.signup = jasmine.createSpy("signup").and.callFake(function () {
  return $q.resolve(...);
});

关于javascript - 在 jasmine 指令 Controller 中返回一个 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37653702/

相关文章:

jasmine - 对 Strongloop Loopback.io 模型的远程方法进行单元测试

javascript - 如何使用 three.js 执行拾取和隐藏对象?

javascript - jQuery 数据表页脚总和 hh :mm:ss data type column

javascript - 如何使用 $sce 插入带有 angular.js 的 iframe?

javascript - ng-show 不适用于简单的 Div

javascript - 使用 Jasmine 测试套件测试点击事件

angularjs - 如何使用 Jasmine 测试调用返回 Promise 的服务方法的 AngularJS Controller

javascript - Meteor 服务器端控制台错误

javascript - 错误! make ionic serve 命令失败(要求检查安装的 node.js 和 npm 的版本)

angularjs - AngularJS : how to reroute to another state after error handling