У меня есть контроллер, который имеет обратный вызов внутри:
angular.module('controllers').controller('MainCtrl', function() {
var result = {};
var self = this;
this.test = function(data) {
jsonld.expand(data, function(err, expanded) {
self.result = expanded;
});
}
});
Моя проблема в том, что мне нужно проверить значение "результат" в модульном тесте, но если я просто вызову ctrl.test(data), а затем ctrl.result, значение ctrl.result будет {}, и это должно быть то, что была возвращена тестовой функцией (внутри jsonld.expand). Есть ли способ проверить это поведение (проверить self.result, когда происходит обратный вызов)?
Я уже искал, но все, что я нашел, связано с пользовательскими службами, но в этом случае это внешняя библиотека.
Если вы хотите протестировать свой код, вы должны соблюдать определенные правила. Например, не используйте глобальные переменные/зависимости.
В вашем примере используется jsonld
глобальная зависимость. В модульных тестах мы тестируем только один компонент, зависимости заменяются на mocks.
Как изменить код, чтобы его можно было лучше проверить?
angular.module('controllers')
.controller('MainCtrl', function(jsonld) {
var result = {};
var self = this;
this.test = function(data) {
jsonld.expand(data, function(err, expanded) {
self.result = expanded;
});
}
});
Единственная разница - это явно определенная зависимость в конструкторе контроллера - jsonld.
Но теперь вы получаете ошибку. JsonldProvider не существует (или подобным) - потому что угловые зависимости вложений от его контейнера DI (https://docs.angularjs.org/guide/di)
Регистрация jsonld в контейнере DI может выглядеть так:
angular.module('....')
.factory('jsonld', function() { // string jsonld is name of service in DI container
return jsonld; // this is global variable - jsonld library
})
Наконец, мы можем написать тест и mock jsonld - результат здесь http://plnkr.co/edit/6xdVwJsJba8SVZ6d6lgg?p=preview
если вы используете $ http, тестирование будет проще с помощью $ httpBackend, но jsonld - это внешняя библиотека и внутренне не использует $ http. Поэтому тест более сложный.