在每个i = child.expect(['first', 'second'])
文件中,要导入的依赖项在顶部声明。
在测试应用程序时,有没有办法模拟依赖?
例如,假设我有一个使用HTTP模块的应用程序来发出ajax请求。当我测试我的模块时,我想避免发出实际的ajax请求,但是我想要一个模拟的HTTP模块,它只会为了测试而返回一个假的响应。
我怎么能这样做?
答案 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.decodeString
和myDecoder
来测试最终结果是否符合您的期望。
最需要单元测试的是httpResultToAction
函数。同样,在这个例子中,这不需要嘲笑。您需要做的就是创建一些好的和坏的Result
值并测试您的期望。
答案 1 :(得分:1)
您应该将调用Http模块的代码与您要测试的实际逻辑分开。
例如,如果你编写一个以Result Error String
作为参数的函数(例如可能从调用Http.getString
返回),你可以轻松地对该函数进行单元测试而无需制作一个真正的HTTP呼叫。