1. 간단한 Angular 앱 작성
테스트 작성을 시작하기 전에 먼저 두 숫자의 합을 계산하는 간단한 계산 앱을 작성합니다.
코드는 다음과 같습니다.
<html> <head> <script type="text/javascript" src="https://code.angularjs.org/1.4.0-rc.2/angular.min.js"></script> </head> <body> <!-- This div element corresponds to the CalculatorController we created via the JavaScript--> <div ng-controller="CalculatorController"> <input ng-model="x" type="number"> <input ng-model="y" type="number"> <strong>{{z}}</strong> <!-- the value for ngClick maps to the sum function within the controller body --> <input type="button" ng-click="sum()" value="+"> </div> </body> <script type="text/javascript"> // Creates a new module called 'calculatorApp' angular.module('calculatorApp', []); // Registers a controller to our module 'calculatorApp'. angular.module('calculatorApp').controller('CalculatorController', function CalculatorController($scope) { $scope.z = 0; $scope.sum = function() { $scope.z = $scope.x + $scope.y; }; }); // load the app angular.element(document).ready(function() { angular.bootstrap(document, ['calculatorApp']); }); </script> </html>
2. 몇 가지 기본 개념에 대해 간단히 이야기해 보세요. 관련 :
모듈 만들기
angular.module이 무엇인가요? 모듈을 제작하고 재활용하는 곳입니다. CalculatorApp이라는 새 모듈을 만들고 이 모듈에 구성 요소를 추가합니다.
angular.module('calculatorApp', []);
두 번째 매개변수에 대해서요? 두 번째 매개변수는 필수이며 새 모듈을 생성한다는 것을 나타냅니다. 애플리케이션에 다른 종속성이 필요한 경우 ['ngResource', 'ngCookies']를 전달할 수 있습니다. 두 번째 매개변수가 있으면 이것이 요청에 의해 반환된 모듈의 인스턴스임을 나타냅니다.
개념적으로는 다음과 같은 뜻입니다.
* angular.module.createInstance(name, requires); * angular.module.getInstance(name)
그러나 실제로는 이렇게 씁니다. >
* angular.module('calculatorApp', []); // i.e. createInstance * angular.module('calculatorApp'); // i.e. getInstance모듈에 대한 추가 정보 https://docs.angularjs.org/api/ng/function/angular.module 2. 컨트롤러 추가
angular.module('calculatorApp').controller('CalculatorController', function CalculatorController($scope) { $scope.z = 0; $scope.sum = function() { $scope.z = $scope.x + $scope.y; }; });컨트롤러를 추가합니다. 컨트롤러는 주로 비즈니스 로직을 담당합니다. 뷰에 바인딩되어 있으며 $scope는 뷰 컨트롤러에 대한 직접적인 메신저입니다. 3. 뷰의 요소를 연결합니다.
<div ng-controller="CalculatorController"> <input ng-model="x" type="number"> <input ng-model="y" type="number"> <strong>{{z}}</strong> <!-- the value for ngClick maps to the sum function within the controller body --> <input type="button" ng-click="sum()" value="+"> </div>입력에서 ng-model에 바인딩된 값은 $scope.x와 같은 $scope에 정의되며 버튼 요소에서도 사용됩니다. ng-click은 $scope.sum 메소드에 바인딩됩니다. 3. 테스트 추가
angular.module('calculatorApp').controller('CalculatorController', function CalculatorController($scope) { $scope.z = 0; $scope.sum = function() { $scope.z = $scope.x + $scope.y; }; });컨트롤러를 테스트하기 위해서는 다음 사항을 언급해야 겠죠? + 컨트롤러 인스턴스를 생성하는 방법 + 객체의 속성을 가져오거나 설정하는 방법 + $scope에서 함수를 호출하는 방법
describe('calculator', function () { beforeEach(angular.mock.module('calculatorApp')); var $controller; beforeEach(angular.mock.inject(function(_$controller_){ $controller = _$controller_; })); describe('sum', function () { it('1 + 1 should equal 2', function () { var $scope = {}; var controller = $controller('CalculatorController', { $scope: $scope }); $scope.x = 1; $scope.y = 2; $scope.sum(); expect($scope.z).toBe(3); }); }); });시작하기 전에 , ngMock을 도입해야 합니다. 테스트 코드에 angle.mock을 추가했습니다. ngMock 모듈은 가상 서비스의 단위 테스트를 위한 메커니즘을 제공합니다. 4. 컨트롤러 인스턴스를 가져오는 방법
beforeEach(angular.mock.module('calculatorApp'));calculatorApp이 초기화되면 주입 기능을 사용하여 컨트롤러 참조 문제를 해결할 수 있습니다.
beforeEach(angular.mock.inject(function(_$controller_) { $controller = _$controller_; }));앱이 로드되면 주입 기능을 사용하고 $controller 서비스는 CalculatorController의 인스턴스를 얻을 수 있습니다.
var controller = $controller('CalculatorController', { $scope: $scope });5. 객체의 속성을 가져오거나 설정하는 방법
function CalculatorController($scope) { ... }테스트 $scope는 간단한 JavaScript 객체를 나타냅니다.
var $scope = {}; var controller = $controller('CalculatorController', { $scope: $scope }); // set some properties on the scope object $scope.x = 1; $scope.y = 2;방금 gif에 표시된 내용을 시뮬레이션하기 위해 x와 y의 값을 설정했습니다. 우리는 다음 테스트의 주장처럼 객체의 속성을 읽을 수도 있다는 데 동의합니다.
expect($scope.z).toBe(3);6. 에서 함수를 호출하는 방법 $scope
$scope.sum();