2017-02-23 27 views
0

Я использую свое первое веб-приложение (только после обучения AngularJS) с помощью AngularJS, и я пишу несколько тестов с использованием Jasmine и Karma.Jasmine spec failed

Это мой app.spec.js файл:

describe('PhoneListController', function() { 

    beforeEach(module('phonecatApp')); 

    it('should create a `phones` model with 3 phones', inject(function($controller) { 
    var scope = {}; 
    var ctrl = $controller('PhoneListController', {$scope: scope}); 

    expect(scope.phones.length).toBe(3); 
    expect(scope.name).toBe('world'); 
    })); 

}); 

Который работает правильно. Однако, когда я меняю его на:

describe('PhoneListController', function() { 

    beforeEach(module('phonecatApp')); 

    it('should create a `phones` model with 3 phones', inject(function($controller) { 
    var scope = {}; 
    var ctrl = $controller('PhoneListController', {$scope: scope}); 

    expect(scope.phones.length).toBe(3); 
    })); 

    it('should have world as a name', inject(function($controller) { 
    expect(scope.name).toBe('world'); 
    })); 

}); 

Что не так со вторым подходом? Я думал, что примерно каждый оператор it соответствует одному тестовому примеру, и каждый оператор describe соответствует одному набору тестов. Это неправильно?

Спасибо.

+2

Простая; 'scope' не определен в вашей второй функции' it'. Он определяется только в первом – Phil

ответ

1

Блоки не выполняются, как если бы они были продолжением. Кроме того, переменная scope является локальной для первого теста.

Если разбить его вниз, второй пример делает примерно:

function test1() { 
    module('phonecatApp'); 
    var scope = {}; 
    var ctrl = $controller('PhoneListController', {$scope: scope}); 

    expect(scope.phones.length).toBe(3); 
} 

function test2() { 
    module('phonecatApp'); 
    expect(scope.name).toBe('world'); 
} 

test1(); 
test2(); 

Вы можете видеть, что во втором тесте, нет никакой возможности или контроллер переменная доступна.