2015-07-31 2 views
0

У меня есть следующий очень простой тест, написанный для услуг AngularJS давал приложение:toEqualData согласовань ломает тесты в AngularJS приложении

describe('Services', function() { 

    beforeEach(function(){ 
     this.addMatchers({ 
      toEqualData: function(expected) { 
       return angular.equals(this.actual, expected); 
      } 
     }); 
    }); 

    beforeEach(module('myapp.services')); 

    describe('Album service', function(){ 
     var Album; 

     beforeEach(inject(function (_Album_) { 
      Album = _Album_; 
     })); 

     it('can get an instance of the Album factory', inject(function (Album) { 
      expect(Album).toBeDefined(); 
     })); 
    }); 
}); 

Я просто добавил обычай toEqualData согласовани as advised in the AngularJS documentation. Однако это нарушает тест. Я использую Gulp запустить тест с gulp-karma (хотя тот же проблема возникает, если я использую Карму непосредственно), и я вижу следующее сообщение об ошибке:

$ gulp test 
[10:00:04] Using gulpfile ~/Projects/myapp/gulpfile.js 
[10:00:04] Starting 'jshint'... 
[10:00:04] Starting 'karma'... 
WARN `start` method is deprecated since 0.13. It will be removed in 0.14. Please use 
    server = new Server(config, [done]) 
    server.start() 
instead. 
31 07 2015 10:00:04.362:INFO [karma]: Karma v0.13.3 server started at http://localhost:9876/ 
31 07 2015 10:00:04.368:INFO [launcher]: Starting browser PhantomJS 
[10:00:04] Finished 'jshint' after 277 ms 
31 07 2015 10:00:04.631:INFO [PhantomJS 1.9.8 (Linux 0.0.0)]: Connected on socket sFxRfQ6bJtqM_utNAAAA with id 27252937 
PhantomJS 1.9.8 (Linux 0.0.0) Services Album service can get an instance of the Album factory FAILED 
     TypeError: 'undefined' is not a function (evaluating 'this.addMatchers') 
      at /home/matthew/Projects/myapp/tests/services.tests.js:7 
PhantomJS 1.9.8 (Linux 0.0.0): Executed 7 of 7 (1 FAILED) (0.04 secs/0.022 secs) 
[10:00:04] Finished 'karma' after 558 ms 
[10:00:04] Starting 'test'... 
[10:00:04] Finished 'test' after 11 μs 

Я не могу видеть, где я прошла криво , Есть идеи? На самом деле это нормально работает, если я вывожу пользовательский сокет, который я пока еще не использую, но планирую это сделать. Таким образом, похоже, что виновником является преступник, но поскольку он буквально скопирован и вставлен из документации Angular, я не понимаю, почему он не работает.

ответ

9

решена проблема, в конце концов. Оказывается, API Jasmine изменился между 1.3 и 2.0, и документация AngularJS, похоже, не дает никакой информации об этом. Вот как я исправил проблему, так что, надеюсь, кто-то, кто застрял на этом можно найти рабочее решение:

describe('Services', function() { 

    beforeEach(function(){ 
     jasmine.addMatchers({ 
      toEqualData: function(util, customEqualityTesters) { 
       return { 
        compare: function(actual, expected) { 
         return { 
          pass: angular.equals(actual, expected) 
         }; 
        } 
       }; 
      } 
     }); 
    }); 

    beforeEach(module('myapp.services')); 

    describe('Album service', function(){ 
     var Album; 

     beforeEach(inject(function (_Album_, _$httpBackend_) { 
      Album = _Album_; 
      mockBackend = _$httpBackend_; 
     })); 

     it('can get an instance of the Album factory', inject(function (Album) { 
      mockBackend.expectGET('https://myapp.com/api/albums').respond([{id: 1}, {id: 2}]); 
      expect(Album).toBeDefined(); 
      var albums = Album.query(); 
      mockBackend.flush(); 
      expect(albums).toEqualData([{id: 1}, {id: 2}]); 
     })); 
    }); 
}); 

В принципе, все, что вам сделать, это изменить this для jasmine при добавлении сличителя, проходит через actual и expected как аргументы функции и использовать их, а не this. Кажется, теперь все будет работать.

РЕДАКТИРОВАТЬ: Оказывается, что это не сработало, оно просто потерпело неудачу. Теперь я исправил это.

1

Я считаю, что вы пытаетесь ввести Album в свой тест, но это пример. Вы уже ввели _Album_ в beforeEach.

Попробуйте удалить второй inject (тот, что у it()).

Пример в angulardocs:

// Defined out reference variable outside 
var myService; 

// Wrap the parameter in underscores 
beforeEach(inject(function(_myService_){ 
    myService = _myService_; 
})); 

// Use myService in a series of tests. 
it('makes use of myService', function() { 
    myService.doStuff(); 
}); 
+0

Нет, не имеет значения. Если я выберу пользовательский соединитель, все это сработает, что подсказывает мне, что, вероятно, именно в этом и заключается проблема. –

+0

Вы правы, извините. Ошибка, кажется, указывает на то, что 'угловые.элементы' не определены. Можете ли вы подтвердить, что это так? – illiptic

+0

Хмм ... 'this.addMatchers' отображается как неопределенный, когда я показываю его с помощью' console.log() ', который, я думаю, может быть источником проблемы –

Смежные вопросы