$ http.get()でAuthファクトリを介してログインする単純なアプリ(ヨー角ジェネレータ)をやっています。成功した場合、 "sessionId"値は$ localStorageでローカルに設定されます。すべて正常に動作しますが、私はユニットテストで深刻な問題があります。私は何をテストするべきなのか私の心の中で定義することはできません! これは私の状況です。
コントローラ/ logincontrollers.js
angular.module('myApp')
.controller('LoginCtrl',['$rootScope', '$scope', '$location', '$localStorage', 'Auth', function ($rootScope, $scope, $location, $localStorage, Auth) {
Auth.Logout();
$rootScope.loginSucceeded = false;
$scope.currentUser = {};
$scope.login = function() {
var formData = {
username: $scope.username,
password: $scope.password
};
Auth.Login(formData).then(function (response) {
if (response.data.loginSucceeded === true && response.data.sessionId !== null) {
$scope.currentUser = {username: $scope.username, sessionId: response.data.sessionId};
$localStorage.currentUser = $scope.currentUser;
$rootScope.loginSucceeded = true;
window.location = '/';
} else {
$scope.error = 'Invalid credentials';
}
}, function (response) {
$scope.error = 'Connection error';
console.log(response);
});
};
}]);
サービス/ auth.js
angular.module('myApp')
.constant('baseURL', 'http://localhost:8080')
.factory('Auth',['$http', '$localStorage', 'baseURL', function ($http, $localStorage, baseURL) {
return {
Login: function (data) {
return $http.get(baseURL + '/login', {
params: data
});
},
Logout: function() {
delete $localStorage.currentUser;
}
};
}]);
サーバーは、クエリを使ってログイン要求を受け入れ
http://localhost:8080/login?username=Test&password=Test
そして今、重要なポイントをparamsは。 これは私が誤りなくテストしたものです。
テスト/仕様/ logincontroller.js
describe('Controller: LoginCtrl', function() {
// load the controller's module
beforeEach(module('myApp'));
var scope, $httpBackend, LoginCtrl;
// Initialize the controller and a mock scope
beforeEach(inject(function ($rootScope, _$httpBackend_, $controller, Auth) {
$httpBackend = _$httpBackend_;
scope = $rootScope.$new();
LoginCtrl = $controller('LoginCtrl', {
$scope: scope, Auth: Auth
// place here mocked dependencies
});
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should fetch sessionId', function() {
$httpBackend.when('GET', 'http://localhost:8080/login', {params: {username: "Test", password: "Test"}})
.respond({"sessionId":"c4b0b46a04b54247ac27f3bd4db289a0","loginSucceeded":true});
scope.login();
$httpBackend.flush();
});
});
私はエラーを私に恩返しやろう他のすべての事。 このテストが良いかどうか、私は何をテストすべきか理解してもらえますか?たぶん、フォーム、または$ localStorageまたは何ですか? あなたに私に示唆するための深刻なユニットテストのマニュアル/リソース/ベストプラクティスがありますか?
アドバイスありがとうございます。
--- UPDATE ---
You can explain why if i do this test:
it('should fetch sessionId', function() {
$httpBackend.when('GET', 'http://localhost:8080/login', {params: {username: "Test", password: "Test"}})
.respond({sessionId:"c4b0b46a04b54247ac27f3bd4db289a0",loginSucceeded:true});
scope.login();
expect(scope.sessionId).toEqual('c4b0b46a04b54247ac27f3bd4db289a0');
$httpBackend.flush();
});
私はこのエラーを得た:テストに関する親指の
PhantomJS 2.1.1 (Mac OS X 0.0.0) Controller: LoginCtrl should fetch sessionId FAILED
Expected undefined to equal 'c4b0b46a04b54247ac27f3bd4db289a0'.
test/spec/controllers/logincontroller.js:44:36
[email protected]://localhost:8081/context.js:151:17
PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 5 of 5 (1 FAILED) (0.008 secs/0.063 secs)
あなたのテストは私には良いです。私はコントローラの代わりに工場をテストすることを提案することができます – hpfs