Как выполнить модульное тестирование контроллера с обратным вызовом в AngularJS

0

У меня есть контроллер, который имеет обратный вызов внутри:

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, когда происходит обратный вызов)?

Я уже искал, но все, что я нашел, связано с пользовательскими службами, но в этом случае это внешняя библиотека.

Теги:
callback
unit-testing

1 ответ

0

Если вы хотите протестировать свой код, вы должны соблюдать определенные правила. Например, не используйте глобальные переменные/зависимости.

В вашем примере используется 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. Поэтому тест более сложный.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню