Учитывая, что у меня есть функция IO:
// this can either be IO or some other side effect
//that makes the function less pure
printf "HI"
Я хочу проверить, что IO был вызван правильно.Обязательным решением для проверки правильности вызова IO было бы обернуть оператор IO в объект, смоделировать объект, передать объект с использованием внедрения зависимостей и убедиться, что правильный метод был вызван с правильными параметрами.Интересно, если вместо использования внедрения зависимостей для проверки F #, лучшим способом будет проверка вывода функции (утверждая, что возвращено правильное значение или функция) и заглушение вызова IO;следовательно, снова делая функцию чистой, устраняя побочный эффект вызова ввода-вывода.
Я рассматриваю обертывание всех операций ввода-вывода в специальный модуль, например, так.
let MyPrint print statement = print statement ; statement
, чтобы я мог заглушить функцию ввода-вывода и утверждать в своих тестах, что правильная операция произошла так:
тестируемый код:
let PrintHi = fun(print) -> MyPrint print "HI"
let DoNothing = fun(print) -> ()
let DoIf conditional =
if conditional then PrintHi
else DoNothing
FsUnit:
[<Test>] member test.
let printStub value = ()
``Test Hi Is Printed When TRUE`` ()=
let testedFunc = DoIf true
testedFunc(printStub) |> should equal PrintHi(printStub)
Это хороший способ проверить побочные эффекты ввода-вывода?Есть ли способ лучше?Пожалуйста, имейте в виду, что моя цель - протестировать любой ввод-вывод, а не просто оператор печати.