Size: a a a

2020 July 02

MK

Maxim Koltsov in Haskell
чем ты его замокал?
источник

MK

Maxim Koltsov in Haskell
так-то ты и замоканный инстанс MonadIO в FT может подпихнуть
источник

АГ

Александр Гранин... in Haskell
Maxim Koltsov
чем ты его замокал?
Возвратом какого-нибудь результата. Чаще всего там просто Unit, но иногда и тестовые данные
источник

MK

Maxim Koltsov in Haskell
а как можно знать, что именно за эффект хочется делать?
источник

АГ

Александр Гранин... in Haskell
Maxim Koltsov
а как можно знать, что именно за эффект хочется делать?
Тесты не случайные же. Ты когда пишешь тест, ожидаешь какое-то поведение. Можешь замокать так или сяк, и проверить, что выходные результаты ожидаемые
источник

MK

Maxim Koltsov in Haskell
непонятно
источник

АГ

Александр Гранин... in Haskell
В случае с Automatic whitebox testing там еще проще. Там рекординги собираются с реального запуска сценария. У нас там моки есть сразу же
источник

MK

Maxim Koltsov in Haskell
у тебя есть вызов runIO .... в коде
источник

MK

Maxim Koltsov in Haskell
как ты понимаешь, чем его замокать?
источник

АГ

Александр Гранин... in Haskell
Maxim Koltsov
непонятно
Реального эффекта в тесте не происходит. Если бы он происходил, он мог бы вернуть A или B. Ты можешь написать тест и посмотреть, как твой код реагирует на A и B, предоставленные моками
источник

к

кана in Haskell
Александр Гранин
Живой пример. В бэкендной кодобазе Juspay, написанной на PureScript, товарищи накидали кода со скрытыми эффектами. Функция задекларирована чистой, а внутри она делает эффект. Такое возможно, например, при вызове JS-функции. Этот код нельзя было протестировать, он постоянно лез во внешний мир и делал какую-то дичь. Но когда понадобилось сделать его тестируемым (с помощью Automatic Whitebox Testing), мы все эти места нашли и перевели на "люк", - метод runIO, который оборачивает эффекты (назывался он, правда, doAff, но суть та же). Теперь уже мы в наших тестах могли замокать этот метод, и код становился тестируемым.
doAffRR видел, речь про него?
источник

MK

Maxim Koltsov in Haskell
logic :: AppL Int
logic = do
 a :: String <- runIO $ downloadUrl "foo"
 b :: Int <- runIO $ generateRandom 50
 return $ length a * b
источник

MK

Maxim Koltsov in Haskell
как ты это замокаешь?
источник

АГ

Александр Гранин... in Haskell
Maxim Koltsov
как ты понимаешь, чем его замокать?
Ну вот тебе такой вызов:

`runIO $ void $ sendMetrics ab cd"

Как ты думаешь, чем его мокать? Вариант только один - unit.

А вот такой вот вызов?

cfg <- runIO $ readFile "config.json"

Чем его замокать? Каким-нибудь тестовым конфигом
источник

АГ

Александр Гранин... in Haskell
Maxim Koltsov
как ты это замокаешь?
Ну а что сложного? Подставляешь любую разумную строку вместо первого вызова, и какое-то число вместо второго
источник

MK

Maxim Koltsov in Haskell
Александр Гранин
Ну вот тебе такой вызов:

`runIO $ void $ sendMetrics ab cd"

Как ты думаешь, чем его мокать? Вариант только один - unit.

А вот такой вот вызов?

cfg <- runIO $ readFile "config.json"

Чем его замокать? Каким-нибудь тестовым конфигом
ненене, ты мне тут зубы не заговаривай
источник

АГ

Александр Гранин... in Haskell
Ты что хочешь проверить в тесте? Что операция умножения отработала правильно. Вот и проверяешь для нескольких случаев
источник

MK

Maxim Koltsov in Haskell
как твой тестовый фреймворк знает, что в конкретном месте надо подложить "какой-то тестовый конфиг"?
источник

MK

Maxim Koltsov in Haskell
Александр Гранин
Ну а что сложного? Подставляешь любую разумную строку вместо первого вызова, и какое-то число вместо второго
откуда она знает, какого вида "разумная" строка нужна?
источник

MK

Maxim Koltsov in Haskell
я не понимаю
источник