Тестирование устранения дребезга в Elm

Я пытаюсь протестировать функцию устранения дребезга в своем приложении 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))

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


person Jolanda    schedule 25.05.2018    source источник
comment
Возможно, посмотрите на https://github.com/elm-lang/http/blob/master/rate-limit.md   -  person farmio    schedule 25.05.2018


Ответы (1)


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

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

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

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

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

person Gabor    schedule 28.05.2018