在karma / jasmine中运行函数后,值不会更新

时间:2014-12-03 22:43:33

标签: angularjs jasmine karma-runner

我是jasmine / karma的新手,试图为我的角度应用程序编写一个测试,我遇到了一个无法解决的问题,希望有人可以帮助我。

我的问题是我的login()函数更新了我的控制器中的值,但jasmine在.then()内部看不到更新后的值并且测试失败,但是当我更新时成功通过的.then()之外的值。

这是我的控制器:

var Authctrl = this;
Authctrl.myVariable = "oldValue";

Authctrl.login = function () {
    AuthService.login(Authctrl.credentials).then(function(authData){
      Authctrl.credentials = { email: '',password: ''};

     /*case 1 */ Authctrl.myVariable = "newValue"; //test gives error 

    },function(error){
        console.log(error);
        Authctrl.errors.login = 'Wrong username or password. Please try again';
    });

    /*case 2 */ Authctrl.myVariable = "newValue"; //test passes successfully

};

和我的测试代码:

it('should be newValue',function(){
    Authctrl.credentials = {
      email: 'myEmail@yahoo.com',
      password: '12345'
    };

    Authctrl.login();

    expect(Authctrl.myVariable).toBe('newValue');

});

和我的服务:

authService.login = function (credentials) {

    return  $q(function(resolve, reject){
      ref.authWithPassword(credentials , function(error, authData) {
        if (error === null) {
          // user authenticated with Firebase
           console.log('SERVICE IS RUNNING, success'); //this does not log when testing with karma
          resolve(authData);
        } else {
          console.log('SERVICE IS RUNNING, error'); //this does not log when testing with karma
          reject(error);

        }
      },{
        remember: "default"
      });//ref.authWithPassword end

      console.log('SERVICE IS RUNNING'); //this logs when testing with karma

    });//$q end
  };//authService.login end

1 个答案:

答案 0 :(得分:0)

所以我终于想出来了,并决定在这里发布答案以防其他人遇到同样的问题。正如@MatthewGreen所说,我必须创建一个模拟服务。并使用$provide来定义模拟AuthService方法及其返回值。我在网上跟踪了许多教程,并且我一直在收到错误,然后我了解到新茉莉花中的一些东西已经改变,其中一个是spyOn命令。 This tutorial给了我很多帮助。

    'use strict';

    describe('Controller: AuthCtrl', function () {

      var $rootScope,$scope,$controller,AuthService,AuthCtrl;

      //fake firebase user data
      var mockAuthData = {
        provider: 'password',
        password:{
          email: 'myEmail@yahoo.com',
          isTemporaryPassword: false
        },
        auth:{
          provider:'password',
          uid:'simplelogin:1'
        },
        uid:'simplelogin:1'
      };



      beforeEach(function() {
        module('myApp');

        // Provide will help us create fake implementations for our dependencies
        module(function($provide) {
          // Fake AuthService Implementation returning a promise
          $provide.value('AuthService', {
            login:function(){
              return{
                then:function(callback){return callback(mockAuthData);}
              };
            }
          });
          return null;
        });
      });


      // load the controller's module
      beforeEach(inject(function(_$rootScope_, _$controller_, _$q_, _AuthService_) {
        $rootScope = _$rootScope_;
        $scope = $rootScope.$new();
        $controller = _$controller_;
        AuthService = _AuthService_;

        AuthCtrl = $controller('AuthCtrl',
          {'$rootScope' : $rootScope, '$scope': $scope, 'AuthService': AuthService});
          $rootScope.$apply(); 
      }));



      it("myVariable should be newValue", function() {

        spyOn(AuthService, 'login').and.callThrough();

        AuthCtrl.login();

        expect(AuthService.login).toHaveBeenCalled();

        expect(AuthCtrl.myVariable).toBe('newValue');
      });



      it("should retrieve the email address", function() {

        spyOn(AuthService, 'login').and.callThrough();


        AuthCtrl.login();

        expect(AuthService.login).toHaveBeenCalled();

        expect(AuthCtrl.userEmail).toBe('myEmail@yahoo.com');
      });;


    });