2013-07-09 13 views
69

Próbuję wprowadzić kod kontrolera jednostki testowej wewnątrz modułu, który pobiera inne moduły jako zależności, ale nie był w stanie wymyślić, jak je poprawnie wyszydzić.Szyderstwo Zależności od modułu kątowego w testach jednostkowych Jasmine

Używam Jasmine Framework i przeprowadzam testy z karmą (testamentem).

Moduł Code

var app = angular.module('events', ['af.widgets', 'angular-table']); 

app.controller('eventsCtrl', function([dependencies]){ 
    $scope.events = []; 
    ... 
}); 

Kod Spec

describe('events module', function(){ 
    var $scope, 
     ctrl; 

    beforeEach(function(){ 
     angular.mock.module('af.widgets', []); 
     angular.mock.module('angular-table', []); 
     module('events', ['af.widgets', 'angular-table']); 
    }); 

    beforeEach(inject(function($rootScope, $controller){ 
     $scope = $rootScope.new(); 
     ctrl = $controller('NameCtrl', { 
      $scope: $scope, 
     }); 
    })); 

    it('should have an empty events array', function(){ 
     expect($scope.events).toBe([]); 
    }) 
}); 

Błąd Dostaję jest Karma "nie ma af.widgets Module", więc oczywiście ja nie szydząc Zależności modułów prawo. Jakieś wskazówki?

+1

zakres $ = $ rootScope.new(); powinno być $ scope = $ rootScope. $ new(); (może dla naszej wersji) –

Odpowiedz

60

Jeśli chcesz wyśmiać moduł, który deklaruje jedną lub więcej usług, które mam Wcześniej używany ten kod:

beforeEach(function(){ 
    module('moduleToMock'); 
    module(function ($provide) { 
     $provide.value('yourService', serviceMock); 
    }); 
}); 

Jest to przydatne, jeśli usługa chcesz szydzić jest również usługa chcesz testów jednostkowych (w innym jaśminu opisać). Rozwiązanie zaproponowane przez fscof jest w porządku, ale nie można utworzyć testu jednostki dla modułu angular-table.

+4

To jest właściwa droga. Ponieważ często nie chcesz używać jednej próby na wszystkie testy. Se także tutaj: http://stackoverflow.com/a/18756347/1105860 –

+0

Oddelegowany. To jest bardziej poprawne. – dgtc

+0

A co jeśli chcę umieścić "serviceMock" w innym pliku, bez deklarowania zmiennych globalnych? –

44

Oto co zorientowali się:

nie ładował moduły any „kątowych stołu” w moim pliku karma.conf.js, stąd ten błąd. Z początku było to celowe, ponieważ chciałem przetestować moduł "zdarzenia" bez rzeczywistego modułu tabeli.

byłem w stanie łatwo drwić moduł „kanciasty-table”, tworząc nowy plik w moim folderze testu zwanego „mocks/kątowe-table.js” i dodawali następujący kod:

/mocks/kątowe-table.js

'use-strict'; 
angular.module('angular-table', []); 

I dodaje ten plik do mojego pliku karma.conf.js wraz z modułem realnej 'Wydarzenia' chciałem badania:

karma.conf.js

... 
files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    'scripts/libs/angular.js', 
    'scripts/libs/angular-mocks.js', 
    'scripts/events.js', // this is the real module. 
    'scripts/mocks/*.js', //loads all custom mocks. 
    'scripts/specs/*.spec.js' // loads my spec file. 
] 
... 

Wreszcie w moim pliku spec, udało mi się dodać oba moduły nazywając je oddzielnie w bloku beforeEach:

specyfikacją/events.spec.js

beforeEach(function(){ 
    module('angular-table'); 
    module('events'); 
}); 

I wpadł na pomysł uporządkowania moich plików w ten sposób od this post

+2

Czy nie kpisz z modułu "kątowego", wywołując angular.module? Myślę, że chcesz zadzwonić do modułu, ponieważ kątowe mocks przywiązują go do globalnego zasięgu? W każdym razie dziękuję, ponieważ pomogło mi to w uruchomieniu moich specyfikacji. – phillyslick

+0

"Udało mi się z łatwością kpić z modułu" kątowego stołu ", tworząc nowy plik w folderze testowym o nazwie" mocks/angular-table.js "i dodając następujący kod: /mocks/angular-table.js " –

+0

@fscof Link daje 404. – Lucio

Powiązane problemy