1

Karma/Jasmine/Mocha を使用してログイン コントローラーを単体テストする方法を考えています。

私は基本的に 200 が戻ってくるかどうかをテストしたいので、$auth.login()保存されたメッセージは「ログインに成功しました」と等しくなければなりません。

アップデート

現時点で、これが私がいるところです。

login.controller.js

function loginCtrl($auth, $scope, $rootScope, $location) {
    var vm = this;

    vm.login = function() {
        var credentials = { email: vm.email, password: vm.password };
        // Use Satellizer's $auth service to login
        $auth.login(credentials).then(function() {
          vm.message = "Successfully logged in!";
        }, function(error) {
          vm.message = "Error logging in!";
        }).then(function(responses) {
          $location.path('home');
        });
    };
}

login.controller.spec.js

describe('Login Controller', function() {
  var q, scope, ctrl, auth;

  beforeEach(module('app.login'));

  beforeEach(inject(function($q, $rootScope, $controller, $auth) {
    q = $q;
    scope = $rootScope.$new();    
    ctrl = $controller('loginCtrl', { $scope: scope, SessionService: sessionService, $auth: auth, $q: q });
    auth = $auth;
  }));

  it('should present a successfull message when logged in', function () {
    var defer = q.defer();
    sinon.stub(auth, 'login')
    .withArgs({ email: 'test@test.com', password: 'test_password' })
    .returns(defer.promise);

    ctrl.login();
    defer.resolve();
    scope.$apply();
    expect(ctrl.message).to.equal('Successfully logged in!');
  });
});
4

1 に答える 1

1

spyOnこれはコントローラーのテストなので、おそらく (Jasmine で)サービス ( $auth) のようにする必要があります -

var defer = $q.defer();
spyOn('$auth', login).andReturn(defer.promise);
controller.email = 'test@test.com';
controller.password = 'test_password';

controller.login();
defer.resolve();
scope.$apply();

expect($auth.login).toHaveBeenCalledWith({ email: 'test@test.com', password: 'test_password' });
expect(scope.message).toEqual("successfully logged in");

失敗の場合はdefer.reject()、アサーションとほぼ同じ形式を使用します。

私の意見では、http関連するステータス コードや応答については、serviceレベルではなくレベルでのみ心配することになりcontrollerます。そこで$httpBackend、ステータスコードと対応する応答で応答をモックするために使用します。

編集

私の研究によると、モカでは、次のようなことをすることになります-

sinon.stub($auth, 'login')
.withArgs({ email: 'test@test.com', password: 'test_password' })
.returns(defer.promise);

stubメソッドに。そして、呼び出しの検証は -

sinon.assert.calledOnce($auth.login);

それ以外はそのままです。メッセージのアサーションもassert.equalfor mocha に変わります。

編集

このフィドルをチェックしてください - http://jsfiddle.net/9bLqh5zc/。スパイには 'sinon' を、アサーションには 'chai' を使用します。

于 2016-01-11T17:20:43.150 に答える