169 похожих чатов

У меня второй тест не проходит, Jasmine не понимает, что

функция была вызвана, кто знает, в чём проблема?

export const testFn = function(): void { };

export const testFn1 = function(): void {
testFn();
};

describe('Тестирование функции testFn1', () => {

beforeEach(() => {
this.moduleObj = { testFn, testFn1 };
});

it('должна выполниться без ошибок', () => {
expect(moduleObj.testFn1).not.toThrow();
});

it('должна вызывать функцию testFn', () => {
spyOn<any>(moduleObj, 'testFn');
moduleObj.testFn1();
expect(moduleObj.testFn).toHaveBeenCalled();
});

});

40 ответов

11 просмотров

А this откуда?

Михаил-Камахин Автор вопроса
Михаил Камахин
Поправил

Всё равно не понятно, что за this

Михаил-Камахин Автор вопроса
Михаил Камахин
В beforeEach создаётся

Ок, а что за объект-то, на что this ссылается?

Михаил-Камахин Автор вопроса
Maxim Afanasev
Ок, а что за объект-то, на что this ссылается?

На какой-то большой объект. Я заменил на такой код, одно и тоже describe('Тестирование функции testFn1', () => { const moduleObj = { testFn, testFn1 }; it('должна выполниться без ошибок', () => { expect(moduleObj.testFn1).not.toThrow(); }); it('должна вызывать функцию testFn', () => { spyOn<any>(moduleObj, 'testFn'); moduleObj.testFn1(); expect(moduleObj.testFn).toHaveBeenCalled(); }); });

Михаил-Камахин Автор вопроса
Maxim Afanasev
Ок, а что за объект-то, на что this ссылается?

Вот ещё вариант, не понимаю, почему он не хочет слушать функцию describe('Тестирование функции testFn1', () => { let moduleObj: any = null; beforeEach(() => { moduleObj = { testFn, testFn1 }; }); it('должна выполниться без ошибок', () => { expect(moduleObj.testFn1).not.toThrow(); }); it('должна вызывать функцию testFn', () => { spyOn<any>(moduleObj, 'testFn'); moduleObj.testFn1(); expect(moduleObj.testFn).toHaveBeenCalled(); }); });

Михаил Камахин
Вот ещё вариант, не понимаю, почему он не хочет сл...

Вот так работает function testFn() {} function testFn1() { this.testFn(); } const moduleObj = { testFn, testFn1 }; describe("test", () => { it("должна вызывать функцию testFn", () => { spyOn(moduleObj, "testFn"); moduleObj.testFn1(); expect(moduleObj.testFn).toHaveBeenCalled(); }); }); Дело в том, что у вас в fn1 прямая ссылка на fn, а jasmine заменяет поле объекта на Spy и следит за ним. Но fn1 вызывает не spy, а функцию напрямую, этот вызов не отслеживается

Михаил-Камахин Автор вопроса
Maxim Afanasev
Вот так работает function testFn() {} function te...

Я привёл этот код как пример. У меня в рабочем коде есть функция, в которой 4 разных функций вызываются. Нужно проверить эти вызовы. Как это сделать, непонятно 😢

Михаил-Камахин Автор вопроса
Михаил-Камахин Автор вопроса

То есть для тестирования функции, нужно её переписать?

Maxim Afanasev
Вот так работает function testFn() {} function te...

в стрикте глобального this нет же

Михаил Камахин
То есть для тестирования функции, нужно её перепис...

можно сказать что в этом и смысл тестирования

Maxim Afanasev
А это не глобальный )

это от сборщика зависит

xxtux Shvets
это от сборщика зависит

Нет, не зависит, посмотри код еще раз

Михаил-Камахин Автор вопроса
Maxim Afanasev
Вот так работает function testFn() {} function te...

А можно как-то решить не переписывая функцию? Только сервисом?

Михаил Камахин
А можно как-то решить не переписывая функцию? Толь...

Используя DI. Не получится никак в рантайме перезаписать значение в замыкании

Михаил-Камахин Автор вопроса
Maxim Afanasev
Используя DI. Не получится никак в рантайме переза...

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

Михаил-Камахин Автор вопроса
Maxim Afanasev
Используя DI. Не получится никак в рантайме переза...

Вы пишите у себя юнит тесты? Вы также переписываете функции в юнит тестах, если они не используют DI? Ведь иногда какие-то функции просто выносятся в отдельные файлы, а не в класс

Михаил Камахин
Вы пишите у себя юнит тесты? Вы также переписывает...

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

Михаил-Камахин Автор вопроса
Максим Федоров
если вы пишите тест с испольованием контейнера — э...

Не понимать. У меня код такой, например: function test() { test1(); test2(); test3(); test4(); } Мне нужно всегда писать так, типа?: function test() { this.test1(); this.test2(); this.test3(); this.test4(); }

Михаил Камахин
Вы пишите у себя юнит тесты? Вы также переписывает...

То, что лежит в замыкании - часть реализации SUT, её нельзя замокать или повесить spy. Это не значит, что её нельзя протестировать. Просто вместе с тем, что в замыкании

Михаил-Камахин Автор вопроса
Михаил Камахин
Не понимать. У меня код такой, например: functio...

DI - это не обязательно inject, это просто паттерн. Может быть function test(fn) {fn();}

Михаил Камахин
Я не знаю слова SUT и оно не гуглится

Гуглится https://en.wikipedia.org/wiki/System_under_test Это то, что вы тестируете

Михаил Камахин
Вы пишите у себя юнит тесты? Вы также переписывает...

Представьте, что у вас есть функция-хелпер util(), которую вы импортируете из файла и используете внутри функции foo(). В это случае util - часть реализации foo и вам не нужно её мокать или проверять, что она была вызвана. Просто тестируйте поведение foo. Вообще, смотреть на код, который вы тестируете - плохая идея, смотреть нужно на интерфейс, реализация может быть разная. Вы можете реализовать foo как с использованием util, так и без него, тест от этого не должен меняться Другое дело, если у функции есть зависимость и вызов этой зависимости - часть логики SUTа. Тогда нужно использовать DI

Михаил-Камахин Автор вопроса
Maxim Afanasev
Представьте, что у вас есть функция-хелпер util(),...

Ладно, не буду смотреть на возвраты функций в таком случае, просто return'ы буду смотреть

Михаил Камахин
Вы пишите у себя юнит тесты? Вы также переписывает...

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

Михаил-Камахин Автор вопроса
xxtux Shvets
я вам сразу сказал, функции в разные файлы вытащит...

Бизнес логика приложения не должна нарушаться

Гуглится (обычно то, что гуглится находится на первых трех страницах гугла, остальное не гуглится)

Михаил Камахин
Бизнес логика приложения не должна нарушаться

Разделить функции по файлам это изменение файловой структуры Изменение бизнес-логики изменение того как функция работает

Юрий Безруков
Гуглится (обычно то, что гуглится находится на пер...

Гуглить тоже надо уметь ) Да и зачем использовать расплывчатый термин, когда есть вполне конкретный, который встрчается в статьях и книгах?

Maxim Afanasev
screenshot Гуглить тоже надо уметь ) Да и зачем использовать ...

Ок, аббревиатура сама по себе не гуглится... According to ISTQB it is the test object.[

Михаил-Камахин Автор вопроса

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
I just installed it but how do I use it?
Talula
12
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Good afternoon, I just started learning php in conjunction with mysql. I am registering a system on a local Mamp server using phpMyAdmin. It seems to be stored normally in the...
ManGo
1
Карта сайта