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