Тестирование Angular-Resource: ожидал объект, получил ресурс
При попытке протестировать некоторый простой угловой код, используя $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
3 ответа
Попробуйте это в своем тестере:
expect(component_controller.current_book).toEqual(angular.toJSON(my_book));
Это лишит свойства объекта, и вы получите совпадение.
Вы также можете попробовать angular.equals
но я не проверял это.
Попробуйте добавить следующее в ваш spec-файл и посмотрите, работает ли он. Я видел это в примере PhoneCat, и он работал для меня.
beforeEach(function() {
jasmine.addCustomEqualityTester(angular.equals);
});
Вы можете попробовать сделать что-то вроде этого:
expect(component_controller.current_book.toJSON()).toEqual(my_book);
У меня была такая же проблема, где я получил ошибку
Ожидаемый объект будет своего рода объектом, но был ресурс (
Это то, что у меня было раньше:
expect(self.project).toEqual(mockProject);
И после того, как я добавил.toJSON(), все было хорошо:
expect(self.project.toJSON()).toEqual(mockProject);
Надеюсь это поможет!