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 ответов

72 просмотра

А 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.[

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта