используя жасмин шпион на частный метод - PullRequest
35 голосов
/ 12 декабря 2011

возможно ли использовать метод spyon фреймворка для модульного тестирования Jasmine на частных методах классов?

В документации приведен этот пример, но может ли он быть гибким для частной функции?

describe("Person", function() {
    it("calls the sayHello() function", function() {
        var fakePerson = new Person();
        spyOn(fakePerson, "sayHello");
        fakePerson.helloSomeone("world");
        expect(fakePerson.sayHello).toHaveBeenCalled();
    });
});

Заранее спасибо

Ответы [ 6 ]

73 голосов
/ 11 февраля 2018

Просто добавьте универсальный параметр <любой> к функции spyon () :

 spyOn<any>(fakePerson, 'sayHello');

Он отлично работает!

3 голосов
/ 10 мая 2018

Typescript компилируется в javascript, а в javascript каждый метод является открытым. Таким образом, вы можете использовать индексную запись массива для доступа к закрытым методам или файлам, а именно:

Object['private_field']

Для получения дополнительной информации посетите следующий блог

3 голосов
/ 21 ноября 2016

если вы используете Typescript для своих объектов, функция на самом деле не является закрытой.
Все, что вам нужно, это сохранить значение, возвращаемое вызовом spyOn, а затем запросить его calls свойство.

В конце этот код должен нормально работать для вас (по крайней мере, он работал для меня):

describe("Person", function() {
    it("calls the sayHello() function", function() {
        var fakePerson = new Person();
        // save the return value:
        var spiedFunction = spyOn(fakePerson, "sayHello");
        fakePerson.helloSomeone("world");
        // query the calls property:
        expect(spiedFunction.calls.any()).toBeFalsy();
    });
});
2 голосов
/ 13 декабря 2011

Нет, потому что вы не можете получить доступ к закрытой функции вне контекста вашего экземпляра.

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

Шпионы полезны при работе с Внедрение зависимостей , когда все внешние зависимости передаются конструктором, а не создаются в вашем классе.Допустим, у вас есть класс, которому нужен элемент dom.Обычно вы используете селектор jquery в классе, чтобы получить этот элемент.Но как вы хотите проверить, что что-то сделано с этим элементом?Конечно, вы можете добавить его на свои тестовые страницы HTML.Но вы также можете вызвать ваш класс, передав элемент в конструктор.Сделав это, вы можете использовать шпион, чтобы проверить, взаимодействует ли ваш класс с этим элементом, как вы ожидали.

0 голосов
/ 24 апреля 2019

В моем случае (машинопись):

jest.spyOn<any, string>(authService, 'isTokenActual')

ИЛИ с поддельным результатом:

jest.spyOn<any, string>(authService, 'isTokenActual').mockImplementation(() => {
  return false;
});
0 голосов
/ 13 декабря 2011

Если вы хотите протестировать закрытые функции внутри класса, почему бы не добавить в ваш класс конструктор, который сигнализирует о возвращении этих закрытых функций?

Прочтите это, чтобы понять, что я имею в виду: http://iainjmitchell.com/blog/?p=255

Я использую подобную идею, и до сих пор она отлично работала!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...