首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS,摩卡,卡玛。测试控制器,模拟服务承诺

AngularJS,摩卡,卡玛。测试控制器,模拟服务承诺
EN

Stack Overflow用户
提问于 2015-05-08 01:16:06
回答 1查看 1.6K关注 0票数 4

我用的是AngularJS,卡玛,摩卡,柴,柴氏承诺,西农.

我正在试下面的控制器。我在模拟服务用户和测试控制器中的.then()部分时遇到了问题。

控制器码

代码语言:javascript
复制
.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码

代码语言:javascript
复制
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?

  })
});

我已经尝试了下面的内容,但是断言部分没有被调用。

代码语言:javascript
复制
scope.sendPhoneNumber(12, 53452123).then(function(result){
  result.should.equal("fail");  //THIS SECTION IS NOT CALLED
})

我尝试了以下几种方法,但是它给出了错误:“未定义”不是一个函数(计算‘promise.then.bind(承诺)’)

代码语言:javascript
复制
scope.sendPhoneNumber(12, 53452123).should.eventually.equal("fail");

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

我试图添加sinon.spy(UserMock, 'sendPhoneNumber'),但这并没有什么不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-08 01:24:42

问题是,$scope.sendPhoneNumber没有返回任何东西。试一试

代码语言:javascript
复制
return User.sendPhoneNumber(...

在你的控制器方法中。

另外,如果您要立即解析模拟中的承诺,我发现它工作得很好,可以帮助您设置一个延迟对象

代码语言:javascript
复制
UserMock = {
  sendPhoneNumber: function(countryCode, phoneNumber){
    return $q.when('foo');
  }
};

尽管如此,您可能希望能够控制每个测试中的解析值,因此这更有意义.

代码语言:javascript
复制
var scope;
var UserMock;
var SignupPhoneCtrl;
var deferred;

// snip

inject(function($rootScope, $controller, $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();
}));    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30114254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档