执行elm-test会抛出运行时异常:无法读取未定义的属性'href'

时间:2017-07-04 15:38:24

标签: elm elm-test

以下测试导致运行时异常:

test "search yields profile" <|
\_ ->
    let
        -- Setup
        location =
            Navigation.Location "" "" "" "" "" "" "" "" "" "" ""

        ( model, _ ) =
            Home.init location

        -- Test
        ( newState, _ ) =
            model |> Home.update (Search "Scott")

        -- Verify
        ( onlyOne, isContentProvider1 ) =
            ( (newState.contentProviders |> List.length) == 1
            , newState.contentProviders |> List.member contentProvider1
            )
    in
        Expect.equal (onlyOne && isContentProvider1) True
TypeError: Cannot read property 'href' of undefined
    at Object.getLocation (eval at <anonymous> (my_path\AppData\Roaming\npm\node_modules\elm-test\lib\runner.js:84:37),
<anonymous>:1392 6:17)
    at Function.eval (eval at <anonymous> (my_path\AppData\Roaming\npm\node_modules\elm-test\lib\runner.js:84:37),
<anonymous>:14127:43)
    at A2 (eval at <anonymous> (my_path\AppData\Roaming\npm\node_modules\elm-test\lib\runner.js:84:37),
<anonymous>:92:11)
    at eval (eval at <anonymous> (my_path\AppData\Roaming\npm\node_modules\elm-test\lib\runner.js:84:37),
<anonymous>:21270:31)
    at eval (eval at <anonymous> (my_path\AppData\Roaming\npm\node_modules\elm-test\lib\runner.js:84:37),
<anonymous>:22757:4)
    at my_path\AppData\Roaming\npm\node_modules\elm-test\lib\runner.js:84:32
    at Object.evalElmCode (my_path\AppData\Roaming\npm\node_modules\elm-test\lib\runner.js:84:76)
    at my_path\AppData\Roaming\npm\node_modules\elm-test\bin\elm-test:196:14
    at my_path\AppData\Roaming\npm\node_modules\elm-test\node_modules\graceful-fs\graceful-fs.js:78:16
    at tryToString (fs.js:456:3)

我的预感是 Navigaton.Location 落后于异常。但是,我不知道如何解决这个问题。

源代码可以在GitHub找到。

1 个答案:

答案 0 :(得分:1)

我不知道你是否在Elm Slack上找到了答案,但是我花了一些时间研究这个问题并找到问题的原因。

简而言之,问题是您在使用elm-test运行的Elm文件中调用Navigation.program。在您的情况下,Navigation.program位于Home.elm。将其移至另一个模块(或暂时将其注释掉),您的测试应该运行。

更详细地说,Navigation.program后面的原生代码获得document.location并将其传递到您的init函数中。但是,在运行elm-test时,由于没有浏览器,因此没有document对象。 elm-test将构成一个骨架document对象,但此对象没有location属性,因此尝试获取location.href时会抛出异常。

elm-test包文档(“特定于应用程序的技术”下的第1点)对此效果有一些指导:

  

避免导入Main模块。您的大部分代码都属于其他模块,因此请将其导入。

或者,document.location has now been polyfilled在elm-test版本0.18.9中,因此升级到该版本也将解决此问题。