2013-10-24 22 views
17

Şablonumda bir şablon enjekte eden ve sonra derleyen bir kodun yinelenmesini sağlarım. Bu kodu DRY şeyler tutmak için bir yardımcı işlevine ayıkladım. Sorun, bir yardımcı işlevinde beforeEach 's yerleştirmeye çalışırken inanıyorum. İşteJasmine/Angular öğesinin birden çok BeforeEach's öğesinin birleştirmesini nasıl sağlayabilirim?

beforeEach(module('app/views/header.html')); 

    beforeEach(inject(function($templateCache, $compile, $rootScope) { 
    template = $templateCache.get('app/views/header.html'); 
    $templateCache.put('views/header.html', template); 
    var directive = angular.element('<clinical-header></clinical-header>'); 
    element = $compile(directive)($rootScope); 
    $rootScope.$digest(); 
    })); 

benim yarattığım yardımcı işlevi olan:: İşte bir işlev içine soyut çalışıyorum benim kod parçasıdır

var setupTemplate = function(templateName, element) { 
    beforeEach(module('app/views/' + templateName)); 
    beforeEach(inject(function($templateCache, $compile, $rootScope) { 
    var template = $templateCache.get('app/views/' + templateName); 
    $templateCache.put('views/' + templateName, template); 
    var directive = angular.element(element); 
    element = $compile(directive)($rootScope); 
    $rootScope.$digest(); 
    })); 

Ve şimdi bu yardımcı işlevine çağrıdır : benim yardımcı fonksiyonunun sonunda

setupTemplate('header.html', '<clinical-header></clinical-header>'); 

, her şey iyi görünüyor, ama benim it bloğuna atladığında, her şey tanımlanmamıştır. Birden çok beforeEach'u ayıklayabilir miyim? Bunu yapmanın doğru yolu nedir? Ayrıca, yasemin yardımcı fonksiyonlarını yerleştirmek için uygun yer neresidir ve bu nasıl yapılır?

cevap

15

Global beforeEach() işlevlerini, belirli bir açıklama işlevinin bağlamı dışında yazarak oluşturabilirsiniz. Bu işlevle bir spec-helper.js sınıfı oluşturmalı ve Karma yapılandırmasıyla yüklemelisiniz.

BeforeEach işlevlerinin, çalıştırdığınız işlevden önce (global olduklarından) çalışacağını unutmayın.

Göstermek için bir fiddle oluşturdum, ancak Karma ile anahtarı, dosya tarayıcıya yüklenecek şekilde yapılandırmaya eklemektir.

Spec Yardımcısı:

var myGlobal; 
beforeEach(function() { 
    // This will run before any it function. 
    // Resetting a global state so the change in this function is testable 
    myGlobal = 10 
}); 

Test Suite: Yalnızca testleri ayrı dosyalarda olan testlerin bir alt kümesi için kod çalıştırmak istiyorsanız

describe('first suite', function(){ 
    it('is a test', function(){ 
    expect(myGlobal).toBe(10); 
    // Reset the value to show that beforeEach is executed for each it function 
    myGlobal = 20; 
    expect(myGlobal).toBe(20); 
    }); 

    it('is another test', function($location){ 
    expect(myGlobal).toBe(10); 
    myGlobal = 20; 
    expect(myGlobal).toBe(20); 
    }); 
}); 
+1

Bu sorunu çözmez . –

+1

Haklısınız. Bu, tüm testler için geçerlidir, dosyalarına bakılmaksızın –

+3

Projemde çok benzer bir durum var. Global 'beforeEach' çağrılarını bir işlevin içine koydum ve bu işlevi, ihtiyaç duyduğum herhangi bir test paketi için' açıklama 'bloğumun üst kısmına çağırıyorum. –

İlgili konular