Как заглушить функцию сервера узла с помощью Cypress - PullRequest
0 голосов
/ 25 апреля 2020

Я использую Sapper, у которого есть функция preload перед загрузкой страницы. Эта функция предварительной загрузки находится на сервере узлов, что позволяет странице увлажняться. Cypress, похоже, не заглушает запросы API в этой функции предварительной загрузки.

Мысли о том, как заглушить эти запросы?

Заглушка Cypress:

cy.server()
cy.route({
  method: 'GET',
  url: 'v1/preference',
  status: 200,
  response: {}
}).as('postPreference')

Моя функция предварительной загрузки :

<script context='module'>
    import * as api from 'api.js'

    export async function preload(params, session) {
        const { user } = session
        if (!user) { return this.redirect(302, 'sign-in') }
        const preference = await api.get('v1/preference', session.token)
        return { preference }
    }
</script>

1 Ответ

0 голосов
/ 28 апреля 2020

Поскольку Sapper - это SSR, функция предварительной загрузки вызывается на сервере узла при первом запросе страницы. При переходе на разные страницы эта функция предварительной загрузки затем вызывается в браузере, что позволяет блокировать эти запросы API.

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

testing / rout.svelte

<script context='module'>
    // See /cypress/support/commands.js #visitLocal
    export async function preload(page, session) {
        const { query } = page
        const href = query.href
        if (!href) { return this.redirect(302, '/') }
        return { href }
    }
</script>

<script>
    import { goto } from '@sapper/app'
    export let href
    goto(href)
</script>

Cypress команды. js

Cypress.Commands.add('visitLocal', (path) => {
  cy.visit(`testing/routes?href=${path}`, { failOnStatusCode: false })
  cy.hydrated() // https://stackoverflow.com/a/61374676/13124916
})

Использовать в тест: cy.visitLocal('route-you-want-to-test-with-preload-being-called')

...