2016-02-01 3 views
4

В каждом файле elm объявленные зависимости импортируются вверху. Есть ли способ, проверяя приложение, издеваться над зависимостью?Взаимозависимая зависимость в Elm

Например, предположим, что у меня есть приложение, использующее HTTP-модуль для создания запроса ajax. Когда я тестирую свой модуль, я бы хотел, чтобы избежать фактического запроса ajax, но я хотел бы иметь издевавшийся HTTP-модуль, который вернет поддельный ответ только ради тестирования.

Как я мог это сделать?

ответ

7

Поскольку Elm - это чистый функциональный язык, вам часто не нужно делать каких-либо насмешек, потому что побочные эффекты ограничены взаимодействием с портами. Большую часть времени вы можете просто вызвать функцию, которую хотите проверить непосредственно.

Рассмотрим типичный пример задачи запроса HTTP привязывается к действию:

type alias MyThing = 
    { id : Int 
    , name : String 
    } 

type Action 
    = FetchData 
    | ErrorOccurred String 
    | DataFetched MyThing 

myDecoder : Json.Decoder MyThing 
myDecoder = 
    Json.object2 
    MyThing 
    ("id" := Json.int) 
    ("name" := Json.string) 

fetchData : Effects Action 
fetchData = 
    Http.get myDecoder url 
    |> Task.toResult 
    |> Task.map httpResultToAction 
    |> Effects.task 

httpResultToAction : Result Http.Error MyThing -> Action 
httpResultToAction result = 
    case result of 
    Ok thing -> 
     DataFetched thing 
    Err err -> 
     ErrorOccurred (toString err) 

Есть несколько вещей, которые выиграют от тестирования здесь, но ни один из них не требуют насмешливый.

Возможно, вы захотите протестировать декодирование JSON myDecoder. Вы могли бы просто создать хорошие и плохие строки JSON и использовать Json.Decode.decodeString с myDecoder, чтобы проверить, что конечный результат соответствует вашему ожиданию.

Вещь, которая, вероятно, больше всего нуждается в модульном тестировании, это функция httpResultToAction. Опять же, в этом примере это не требует насмешек. Все, что вам нужно сделать, это создать ряд хороших и плохих значений Result и проверить ваши ожидания.

+0

Был ли способ проверить 'fetchData' в этой ситуации? – phtrivier

+0

Это зависит от того, что вы на самом деле хотите проверить. 'fetchData' возвращает тип' Effects', который является мелкой оболочкой вокруг 'Task'. Он фактически не выполняет HTTP-запрос. Ваши тесты будут вращаться вокруг отрыва получаемого значения результата «Эффекты» и проверки «Задачи», но в этот момент ваши тесты больше сосредоточены на тестировании кода Elm, чем на самом деле тестирование вашего приложения. –

+0

На самом деле, что я мог найти сложно, сначала получить цепочку ''> 'операторов. Но тогда, возможно, просто получить его для компиляции является достаточным доказательством того, что он работает; и тестирование других частей - это значение. – phtrivier

1

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

Например, если вы напишете функцию, которая принимает в качестве аргумента Result Error String (например, может вернуться от вызова до Http.getString), вы можете легко выполнить тестирование этой функции без необходимости совершать реальный HTTP-вызов.

Смежные вопросы