加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

AngularJS,Mocha,Karma.测试控制器,模拟服务承诺

发布时间:2020-12-17 16:56:57 所属栏目:安全 来源:网络整理
导读:我正在使用AngularJS,Karma,Mocha,Chai,Chai-as-promise,Sinon. 我正在尝试下面的控制器.我无法模拟服务User并测试控制器中的.then()部分. 控制器代码 .controller('SignupPhoneCtrl',function(User,$scope) { $scope.sendPhoneNumber = function(countryCod
我正在使用AngularJS,Karma,Mocha,Chai,Chai-as-promise,Sinon.

我正在尝试下面的控制器.我无法模拟服务User并测试控制器中的.then()部分.

控制器代码

.controller('SignupPhoneCtrl',function(User,$scope) {
  $scope.sendPhoneNumber = function(countryCode,phoneNumber){
    User.sendPhoneNumber(countryCode,phoneNumber)
    .then(function(result){
      if(result == "success"){
        //I WANT TO TEST THIS SECTION
        return "success";
      }
        //I WANT TO TEST THIS SECTION
      return "fail";
    });
  }
})

ControllerTest代码

describe('Controller: Signup-phone',function() {
  var scope;
  var UserMock;
  var SignupPhoneCtrl;

  beforeEach(function() {
    module('starter.controllers');
  });

  beforeEach(inject(function($rootScope,$controller,$q){
    scope = $rootScope.$new();
    UserMock = {
      sendPhoneNumber: function(countryCode,phoneNumber){
        var deferred = $q.defer();
        // console.log("called"); //This part is being called
        deferred.resolve('foo');
        return deferred.promise;
      }
    };
    SignupPhoneCtrl = $controller("SignupPhoneCtrl",{$scope: scope,User: UserMock});
  }))

  it('should return asdf',function(){
    scope.$digest();

    //WHAT SHOULD I WRITE HERE?

  })
});

我已尝试过以下但断言部分未被调用.

scope.sendPhoneNumber(12,53452123).then(function(result){
  result.should.equal("fail");  //THIS SECTION IS NOT CALLED
})

我尝试了下面的内容,但它给出了错误:’undefined’不是一个函数(评估’promise.then.bind(promise)’

scope.sendPhoneNumber(12,53452123).should.eventually.equal("fail");

sendPhoneNumber(12,53452123)返回Object {$$state:Object {status:0}}

我试图添加sinon.spy(UserMock,’sendPhoneNumber’),但它没有任何区别.

解决方法

问题是,$scope.sendPhoneNumber不返回任何内容.尝试

return User.sendPhoneNumber(...

在你的控制器方法.

此外,如果你只是想立即解决你的模拟中的承诺,我发现这很好用,并节省你设置一个延迟对象

UserMock = {
  sendPhoneNumber: function(countryCode,phoneNumber){
    return $q.when('foo');
  }
};

话虽这么说,你可能希望能够控制每个测试中的解析值,这样更有意义……

var scope;
var UserMock;
var SignupPhoneCtrl;
var deferred;

// snip

inject(function($rootScope,$q) {
    deferred = $q.defer();
    UserMock = {
        sendPhoneNumber: function() {
            return deferred.promise;
        }
    };
});

// snip

it('tests for success',inject(function($rootScope) {
    deferred.resolve('success');

    scope.sendPhoneNumber(...).then(...);

    $rootScope.$apply();
}));

it('tests for failure',inject(function($rootScope) {
    deferred.resolve('not success');

    scope.sendPhoneNumber(...).then(...);

    $rootScope.$apply();
}));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读