Тестирование разоблачения в Elm - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь протестировать функцию отладки в приложении Elm и не могу понять, как это сделать.

Демонстрация применяется к текстовому полю для нечеткого поиска, чтобы избежать слишком большого числа запросов http, он смоделирован на этом примере https://ellie -app.com / jNmstCdv3va1 и следует тому желогика.

type alias Model =
    { search : Maybe String 
    , searchResult : List User
    , debouncingCounter : Int
    }

init : Model
init = 
    { search = Nothing
    , searchResult = [] 
    , debouncingCounter = 0
    }

debounceTime : Time
debounceTime = 350 * Time.millisecond

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
    case msg of 

        (...)

        SearchInput search ->
            let 
                newCounter = model.debouncingCounter + 1
            in
            case search o
                "" -> ({model | search = Nothing, searchResult = []}, Cmd.none)
            _ -> 
                ({ model | search = Just search, debouncingCounter = newCounter }
                , Process.sleep debounceTime |> Task.perform (always (Timeout newCounter)))

        Timeout int ->
            if int==model.debouncingCounter then
                (update SendSearch {model | debouncingCounter = 0 })
            else 
                (update NoOperation model)

        SendSearch ->
            case model.search of 
                Nothing -> 
                    (model, Cmd.none)
                Just string -> 
                    let 
                        cmd = Http.send ReSendSearch <| postApiAdminUserSearchByQuery string
                    in
                    (model, cmd)

        ReSendSearch result ->
            case result of 
                Err _ -> 
                    (model, Cmd.none)

                Ok usersList -> 
                    ({model | searchResult = usersList}, Cmd.none )

Я хочу убедиться, что после вызова

update (searchInput "string") init

запрос Http отправляется только после debounceTime.

Я могу легко протестировать модельсразу после обновления вызывается функция с сообщением searchInput.Например, здесь я проверяю, что начальное значение поля "debouncingCounter" в модели установлено равным 1:

startDebounce : Test
startDebounce =
test "debouncingCounter is set to 1 after search input is updated" <|
    \_ ->
        Users.init
            |> Users.update (Users.SearchInput "abc") 
            |> Tuple.first
            |> .debouncingCounter
            |> Expect.equal 1

Однако я не вижу, как я смог бы проверить влияниезадержанное Cmd Msg в модели, так как я не могу напрямую применить значение cmd, возвращаемое функцией обновления.

Process.sleep debounceTime |> Task.perform (always (Timeout newCounter))

Кажется, что различные способы реализации debouncing не решат проблему, поскольку все они полагаютсяна командные сообщения.

1 Ответ

0 голосов
/ 28 мая 2018

В зависимости от того, что именно вы хотите проверить, вы можете использовать разные подходы.

Если вы хотите проверить

  1. Ваш код на SearchInputвозвращая правильную команду: вы можете рассмотреть возможность использования elm-testable.

  2. Среда выполнения elm, правильно выполняющая команду Process.sleep: это относится к сценариям интеграции / сквозного тестирования .Итак, вам необходимо протестировать полностью скомпилированное приложение, используя один из сквозных инструментов / JS.

  3. Ваш код обрабатывает сообщения Timeout x правильно: для этого просто напишите отдельный тестовый пример.

...