2016-06-09 2 views
2

При попытке проверить некоторые простые угловой код, используя $resource, я в конечном итоге с Resource объект, который содержит $promise ключ и, следовательно, провал формы: Failure/Error: Expected Resource(...) to equal Object(...)Тестирование радиально-ресурсов: Ожидаемое объекта, получил ресурс

Я ожидал вернуть объект, который я передал в метод respond, как часть httpBackend.expectGET('/books/5.json').respond(my_book). Использую ли я $resource неправильно или что-то не так в моем тесте?

Код

var bookApp = angular.module('bookApp', 
    [ 
    'ngResource', 
    ] 
); 

function BookController(scope, $resource) { 
    var ctrl = this; 
    var Book = $resource('/books/:selected.json', {selected:'@id'}); 

    ctrl.fetch_book = function(id){ 
    console.log('Selecting options ' + id); 
    Book.get({selected:id}, function(data){ 
     console.log('Received: ' + JSON.stringify(data)); 
     ctrl.current_book = data; 
    }); 
    }; 
} 

BookController.$inject = ['$scope', '$resource']; 

bookApp.component('book', { 
    controller: BookController 
}); 

Тест

describe('component: tree', function() { 
    var component_controller, $componentController, httpBackend, my_book; 

    beforeEach(module('bookApp')); 

    beforeEach(inject(function($httpBackend, _$componentController_) { 
    httpBackend = $httpBackend; 
    $componentController = _$componentController_; 
    })); 

    describe('$ctrl.fetch_book(book_id)', function(){ 

    beforeEach(function() { 
     component_controller = $componentController('book'); 
     my_book = {title: 'Sanctuary', id: '5'}; 
    }); 

    it('fetches the book with id=book_id', function(){ 
     httpBackend.expectGET('/books/5.json').respond(my_book); 
     component_controller.fetch_book(5); 
     httpBackend.flush(); 
     console.log('Options: ' + JSON.stringify(component_controller.current_book)); 
     console.log('constructor: ' + JSON.stringify(component_controller.current_book.constructor.name)); 
     expect(component_controller.current_book).toEqual(my_book); 
    }); 
    }); 
}); 

Результат

$ bundle exec teaspoon -f documentation 

component: tree 
    $ctrl.fetch_book(book_id) 
    fetches the book with id=book_id (FAILED - 1) 
     # Selecting options 5 
     # Received: {"title":"Sanctuary","id":"5"} 
     # Options: {"title":"Sanctuary","id":"5"} 
     # constructor: "Resource" 

Failures: 

    1) component: tree $ctrl.fetch_book(book_id) fetches the book with id=book_id 
    Failure/Error: Expected Resource({ title: 'Sanctuary', id: '5', 
    $promise: Promise({ $$state: Object({ status: 1, value: 
    <circular reference: Object> }) }), $resolved: true }) to equal 
    Object({ title: 'Sanctuary', id: '5' }). 

Finished in 0.02600 seconds 
1 example, 1 failure 

ответ

1

Попробуйте это в тестере:

expect(component_controller.current_book).toEqual(angular.toJSON(my_book)); 

Это разделит свойства объекта, и вы получите соответствие.

Вы также можете попробовать angular.equals, но я не проверял это.

1

Попробуйте добавить в свой spec-файл следующее и посмотреть, работает ли оно. Я видел это в примере PhoneCat, и это сработало для меня.

beforeEach(function() { 
    jasmine.addCustomEqualityTester(angular.equals); 
    }); 
0

Вы можете попробовать сделать что-то вроде этого:

Я имел такой же вопрос, где я получил ошибку

ожидаемый объект, своего рода объект, но Ресурс (

Это то, что у меня было до:

expect(self.project).toEqual(mockProject); 

И после того, как я добавил .toJSON() все это было хорошо:

expect(self.project.toJSON()).toEqual(mockProject); 

Надеется, что это помогает!

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