1

皆さん、こんにちは。

単体テストで localStorage/cookie の値を適切に設定する方法を知りたいだけです。以下のコードでは、Cookie を設定し、その Cookie の値を取得しようとしましたが、常に null が表示されます。

このコード スニペットは、私がテストしようとしているものです。

scope.$on("$locationChangeSuccess", function(event, next, current) 
    {
        if(location.path() === '/home') {
            if(!Utils.isBlank(session.get('token'))) {
                    var usertype = session.get('usertype');
                    // console.log('landed home');
                    if(usertype === 'player') location.path('/user/dashboard');
                    if(usertype === 'broadcaster') location.path('/broadcaster/dashboard');
                    if(usertype === 'quizmaster') location.path('/quizmaster/dashboard');         
            }
        }   
    });

私のcontrollerSpec.js

describe('MainCtrl', function() {

var scope, api, security, clearAll, location, redirect, session, utility;
beforeEach(inject(function($rootScope, $controller ,$location, Api, Security, Utils, localStorageService){
    scope = $rootScope.$new();
    location = $location;
    session = localStorageService
    utility = Utils;

    $controller("MainCtrl", {
        $scope : scope,
        localStorageService : session,
        Api : Api,
        $location : location,
        Utility : utility
    });
}));

it('should expect player to be redirected to /user/dashboard', function() {
  //set the location to home
  var home = spyOn(location, 'path');
  var addSession = spyOn(session, 'add');
  var token = 'testToken';

  location.path('/home');

  scope.$on('$locationChangeSuccess', {})
  expect(home).toHaveBeenCalledWith('/home');

  //mock a session
  session.add('token',token);
  expect(addSession).toHaveBeenCalled();
  expect(session.get('token')).toEqual('testToken');
});

エラー:

Chrome 24.0 (Linux) controllers MainCtrl MainCtrl should expect player to be redirected to /user/dashboard FAILED
Expected null to equal 'testToken'.

トークン "session.add('token', token)" を既に設定していますが、まだトークンが null であることを示しています。session.add メソッドが呼び出されたかどうかを確認するために spyOn を追加しました。助けてください。

4

1 に答える 1

2

サービスのメソッドをモックしaddました。スパイ中に呼び出したい場合は、使用する必要がありますandCallThrough()

var addSession = spyOn(session, 'add').andCallThrough();

Jasmine を初めて使用する場合、これは明らかではないかもしれません。これがspyOnのデフォルト機能であるべきだと人々が不満を言う問題がありました(見つけられませんでした、ごめんなさい)。IMHO、ユニットテストのみを行うことになっており、コントローラーが完全な統合テストを行うことを期待していないため、そのままで良いです(つまり、session.get期待を削除します。セッションが機能することをテストしていません。ライブラリにある必要があります)テスト)。

更新コメントに答えて、ローカル ストレージに保存されているトークンに基づいて URL をテストするには、次のようにします。

spyOn(session, 'get').andReturn(token); //Remember, you are not testing the service, you assume it works.

トークンの値に応じて、できることexpect(location.path()).toBe('/registeredUserOnly')

于 2013-09-12T07:37:11.913 に答える