тестирование угловых сервисов внутренних вызовов методов

0

У меня есть следующая простая услуга

app.factory('Shoes', function() {
    function a() {return 12;}
    function b() {return a();}

    return {
      a: a,
      b: b
    }
  })

Я хочу проверить, вызван ли метод a при вызове метода b. Мой тест выглядит так:

describe('Testing a Shoes service', function() {
  var service;

  beforeEach(module('plunker'));

  beforeEach(inject(function(Shoes) {
    service = Shoes;
  }))

  it('.b should call .a', function() {
    spyOn(service, 'a');
    service.b();
    expect(service.a).toHaveBeenCalled();
  })

});

Но тесты терпят неудачу. Релевантный плункер находится здесь.

Вопрос в том, как я могу проверить такие взаимодействия?

Теги:
unit-testing
jasmine

3 ответа

3
Лучший ответ

Что здесь происходит, так это то, что вы устанавливаете шпион по методу service.a, но внутренний a (который внутренне называется b) остается тем же внутренним методом (то есть не шпионом), поэтому ваш тест терпит неудачу.

Если вы действительно хотите это сделать, единственный способ - не вызвать внутренний a а метод вашего сервиса:

app.factory('Shoes', function() {
    return {
        a: function a() {
            return 12;
        },

        b: function b() {
            return this.a();
        }
    };
});

Вот обновление вашего plunkr: https://plnkr.co/edit/6FZptdcX9qwyOE6kbgAX

РЕДАКТИРОВАТЬ:

Просто некоторые объяснение: service.a метод просто указатель на внутренний a методе. Когда вы говорите spyOn(service, 'a'), вы просто перезаписываете указатель service.a указывающий на совершенно другой метод (т.е. Шпион, созданный жасмином). Внутренний метод является частным и никогда не будет обновляться, так что, если вы звоните a a() во внутреннем b методе, вы просто вызываете оригинальный метод не шпион указал на a service.a.

  • 0
    почему шпион не создан для функции, на которую ссылается service.a ?
  • 0
    @zmii Смотрите мои правки;)
Показать ещё 1 комментарий
0

Мне удалось исправить эту проблему следующим кодом

app.factory('Shoes', function() {
    var module = {
      a:function(){
        return 12;
      },
      b: function(){
        return this.a();
      }
    }
    return module;
});

Кажется, что ваш тестируемый модуль не может просто вызвать "функцию". Он должен вызывать метод возвращаемого объекта;

Обновлен Plunker: https://plnkr.co/edit/DeDmdQq3rguO6uGHElW6?p=preview

  • 0
    почему шпион не создан для функции, на которую ссылается service.a ? Разве ссылки не должны быть разрешены на оригинальные функции?
0
app.factory('Shoes', function() {

var self = {
  a: function() {return 12;},
  b: function() {return this.a();}
}

return {
  a: self.a,
  b: self.b
}
})

Я считаю, что, поскольку b не вызывает функцию, на которую вы следите. С фабрикой над испытательными проходами.

  • 0
    почему шпион не создан для функции, на которую ссылается service.a ? Разве ссылки не должны быть разрешены на оригинальные функции?
  • 0
    spyOn (service, 'a') - создает новую шпионскую функцию на месте service.a, тогда как при вызове b-функций она вызывает внутреннюю функцию a, которая существует в той же области, а не шпион, созданный jasmine, в основном то, что Микаэль сказал в ответ выше. Вот так я лично вижу эту проблему.

Ещё вопросы

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