2014-09-02 3 views
0

У меня есть функция, которая вызывает операционную систему и получает данные в реальном времени, так что каждый раз, когда вызов выполняется, результаты будут разными. Функция, которая делает вызов, вложена за пять вызовов функций, то есть стек вызовов находится на пять уровней до того, как будет выполнен вызов ОС.Тестирование модуля с внутренним процессом вложенным в структуру кода: Elixir

Для проверки функции верхнего уровня нужны повторяемые результаты. Два способа проведения тестирования приходят на ум ... 1. Добавьте дополнительный параметр к каждому из пяти вызовов функций и передайте «вызов в операционную систему» ​​в качестве функции. Затем для модульного теста вызов функции операционной системы заменяется функцией, которая возвращает статический текст.
2. Сделайте приложение осведомленным о тестах, а функция ОС вернет статический текст, если он запущен в тестовой среде. (Я не знаю, как это сделать)

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

ответ

4

Вы можете использовать mocks имитировать вызовы ОС:

Для простого примера, если вы хотите проверить код, который вызывает HTTPotion.get, чтобы получить веб-страницу, но не на самом деле извлечения веб-страницы вы могли бы сделать что-то вроде этого.

defmodule MyTest do 
    use ExUnit.Case, async: false 

    import Mock 

    test_with_mock "test_name", HTTPotion, 
    [get: fn(_url) -> "<html></html>" end] do 
    HTTPotion.get("http://example.com") 
    assert called HTTPotion.get("http://example.com") 
    end 
end 

with_mock создает модуль-макет. Список ключевых слов предоставляет набор макетной реализации для функций, которые мы хотим предоставить в макете (в данном случае только get). Внутри with_mock мы используем тестовый код, и мы можем проверить, что вызов был выполнен так, как мы ожидали, используя called и предоставив пример ожидаемого вызова (второй аргумент :_ имеет особое значение для сопоставления чего-либо).

+0

Моты могут быть одним из способов реализации моей «опции 2.». выше. – steve77

+0

@ steve77 - вся идея насмешки заключается в том, что вы можете протестировать приложение _without_, осознавая это испытание. –