Which testing framework do you want to use ? Press tab to list possible options. Enter to move to the next question. > jasmine
Do you want to use Require.js ? This will add Require.js plugin. Press tab to list possible options. Enter to move to the next question. > no
Do you want to capture any browsers automatically ? Press tab to list possible options. Enter empty string to move to the next question. > Chrome >
What is the location of your source and test files ? You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js". Enter empty string to move to the next question. >
Should any of the files included by the previous patterns be excluded ? You can use glob patterns, eg. "**/*.swp". Enter empty string to move to the next question. >
Do you want Karma to watch all the files and run the tests on change ? Press tab to list possible options. > yes
Config file generated at "/Users/qkboo/www-app/angularjs-karma/karma.conf.js".
현재 설정을 테스트하기 위해 start 명령으로 시작하면 karma 서버가 시작된다.
1 2
$ karma start 20 12 2017 12:41:02.798:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9876/
데스크탑 환경이면 karma.conf.js 에 지정한 브라우저가 실행되어 보여준다.
테스트 스펙 작성
실제 테스트 시나리오를 기술하는 jasmine 테스트 스펙 파일은 아래 같은 구조를 가지고 있다.
// 1. 모듈을 들여오고 beforeEach(module("myapp.controller")); //모듈 로드
describe("컨트롤러 모듈 테스트", function () { //2. 필요한 모듈, 여기서 $scope를 주입하고 it("컨트롤러 들여오기", inject([ "$rootScope", "$controller", function ($rootScope, $controller) { // 새 스코프 scope = $rootScope.$new(); // 대상 컨트롤러에 의존성을 주입하고 들여온다. userListController = $controller("userListController", { $scope: scope, }); }, ])); //3. 모듈에 적재되었는지 테스트한다. it("userListController 컨트롤러가 정의되어 있다.", function () { expect(userListController).toBeDefined(); }); }); });
실제 컨트롤러 소스 가 없으므로 아래 같이 에러가 발생한다.
1 2 3 4 5 6
Chrome 63.0.3239 (Mac OS X 10.12.6) 서비스 테스트 컨트롤러 모듈 테스트 userListController 컨트롤러가 정의되어 있다. FAILED ReferenceError: userListController is not defined at UserContext.<anonymous> (app/src/test/test.controller.js:18:14) Chrome 63.0.3239 (Mac OS X 10.12.6): Executed 2 of 3 (2 FAILED) (0 secs / 0.013 sec Chrome 63.0.3239 (Mac OS X 10.12.6): Executed 3 of 3 (2 FAILED) (0 secs / 0.018 sec Chrome 63.0.3239 (Mac OS X 10.12.6): Executed 3 of 3 (2 FAILED) (0.026 secs / 0.018 secs)
이제 app/src/controller/myapp.controller.js 소스를 작성한다.
describe("서비스 테스트", function () { var userListController, scope, mockService;
beforeEach(module("myapp.controller")); //모듈 로드
describe("컨트롤러 모듈 테스트", function () { it("컨트롤러 들여오기", inject([ "$rootScope", "$controller", function ($rootScope, $controller) { scope = $rootScope.$new();
//임의 사용자 조회 서비스를 만든다. mockService = { getUserList: function (callback) { callback.call(null, [{ name: "Hello" }]); }, };
// 대상 컨트롤러에 의존성을 주입하고 'UserService' 서비스를 주입한다. userListController = $controller("userListController", { $scope: scope, UserService: mockService, }); }, ])); it("userListController 컨트롤러가 정의되어 있다.", function () { expect(userListController).toBeDefined(); }); // 사용자 조회 함수를 테스트 한다. it("사용자를 조회한다.", function () { scope.searchUsers(); // 1건의 결과가 있다. expect(scope.userList.length).toEqual(1); }); }); });
컨트롤러에 searchUsers() 함수가 없으므로 에러가 발생한다.
1
TypeError: scope.searchUsers is not a function
컨트롤러에 UserService를 주입하고, searchusers() 함수를 선언해 준다.
// http 응답에 1건이 있으므로 expect(d.length).toBe(1); }));
실제 getUserList() 함수가 구현 안되어 있으므로 다음 같이 실패가 나타난다.
1 2 3
20 12 2017 14:59:44.061:INFO [watcher]: Changed file "/Users/qkboo/www-app/angularjs-karma/app/src/test/test.service.js". Chrome 63.0.3239 (Mac OS X 10.12.6) 서비스 테스트 UserService.getUserList 가 사용자를 조회한다 FAILED TypeError: UserService.getUserList is not a function