模仿榆树的依赖

时间:2016-02-01 15:51:35

标签: ajax unit-testing elm

在每个i = child.expect(['first', 'second']) 文件中,要导入的依赖项在顶部声明。 在测试应用程序时,有没有办法模拟依赖?

例如,假设我有一个使用HTTP模块的应用程序来发出ajax请求。当我测试我的模块时,我想避免发出实际的ajax请求,但是我想要一个模拟的HTTP模块,它只会为了测试而返回一个假的响应。

我怎么能这样做?

2 个答案:

答案 0 :(得分:8)

由于Elm是一种纯函数式语言,因此您通常不需要进行任何类型的模拟,因为副作用仅限于与端口的交互。大多数情况下,您可以直接调用要测试的功能。

考虑这个映射到Action的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)

这里有一些可以从测试中受益的东西,但它们都不需要嘲笑。

您可能想要测试myDecoder的JSON解码。您可以简单地创建一些好的和坏的JSON字符串,并使用Json.Decode.decodeStringmyDecoder来测试最终结果是否符合您的期望。

最需要单元测试的是httpResultToAction函数。同样,在这个例子中,这不需要嘲笑。您需要做的就是创建一些好的和坏的Result值并测试您的期望。

答案 1 :(得分:1)

您应该将调用Http模块的代码与您要测试的实际逻辑分开。

例如,如果你编写一个以Result Error String作为参数的函数(例如可能从调用Http.getString返回),你可以轻松地对该函数进行单元测试而无需制作一个真正的HTTP呼叫。