为了处理前端开发者特有的问题,如速度、可访问性和优化,Next.js、Nuxt.js和Scully被引入,分别用来补充React、Vue和Angular。SvelteKit是一个用于构建高性能Web应用的框架,是在其前身Sapper的基础上引入的,以补充Svelte。
在这篇文章中,我们将介绍如何测试用SvelteKit构建的应用程序,包括单元测试和端到端测试等领域。让我们开始吧!
TL;DR: 你可以在GitHub上查看这个测试项目的代码样本
从头开始创建一个SvelteKit应用程序
首先,我们将创建一个新的SvelteKit应用程序。在你的终端,运行以下命令。
# start up a Svelte app
npm init svelte@next my-app
# navigate to the app
cd my-app
# install dependencies
npm install
#start up the development server
npm run dev
上面的代码生成了一个光秃秃的Svelte应用,看起来像下面的图片。
我们新创建的应用程序有三个组件,即主页index.svelte ,关于页面about.svelte ,以及在欢迎横幅上方看到的todos页面todo/index.svelte 。
为了增加应用程序的复杂性并创造更多的测试场景,让我们为我们的应用程序添加一个额外的组件,该组件将从礼品卡服务提供商Reloadly获取并显示礼品卡数据集合。导航到src/routes 文件夹,用下面的代码创建礼品卡组件。
// src/routes/giftcards.svelte
<svelte:head>
<title>Giftcards</title>
</svelte:head>
<script>
import { onMount } from 'svelte';
const accessToken = 'Bearer ACCESS_TOKEN'
let results = [];
onMount(() => {
getGiftCards();
})
let headers = {
'Accept' : 'application/com.reloadly.giftcards-v1+json',
'Authorization' : accessToken
}
const getGiftCards = async () => {
const res = await fetch('https://giftcards.reloadly.com/countries/es/products', {
method: 'GET',
headers: headers
});
const json = await res.json();
results = json
};
</script>
在上面的代码片段中,首先,我们用<svelte:head> 元素指定礼品卡组件的头。接下来,我们向Reloadly发出HTTPGET 请求,以获取我们的应用程序所需的礼品卡列表。
当我们发出请求时,我们将需要Reloadly的访问令牌。为了获得访问令牌,请按照快速入门指南中的简短步骤创建一个Reloadly账户。
最后,为了总结我们的礼品卡组件,让我们用一个each 块来解析我们收到的数据。
// src/routes/giftcards.svelte
<main class= 'response'>
{#each results as result}
<div class="data">
<img class="product_image" src="{result.logoUrls[0]}" alt="gift card images" width="200px"/>
<p class="product_name">{result.productName}</p>
<p class="currency_code">Currency: {result.recipientCurrencyCode}</p>
<p class="redeem_instructions">Redeem Instructions: {result.redeemInstruction.concise}</p>
</div>
{/each}
</main>
现在我们的礼品卡组件已经准备好了,我们应该有一个类似于以下的用户界面。
上面的视频显示了我们的用户界面,以显示不同的礼品卡,包括货币(目前设置为美元),以及包含兑换说明的链接。
为了简化我们的代码,我们省去了CSS样式,但如果你愿意,你可以访问并修改它。
用Jest和Svelte测试库对SvelteKit进行单元测试
对于我们的第一个测试用例,我们将涵盖单元测试,这将使我们能够单独测试每个组件。我们将使用Svelte测试库,一个用于测试Svelte组件的轻量级库,和Jest,一个JavaScript测试框架。让我们从安装这两个工具开始。
npm install --save-dev @testing-library/svelte jest
要在Svelte中使用Jest,首先,我们需要安装以下依赖项。
npm install --save-dev svelte-jester babel-jest @testing-library/jest-dom
svelte-jester: 一个可以编译Svelte组件的依赖项babel-jest: Jest的babel.transform,用于ES6模块。jest-dom:一个提供一组自定义Jest匹配器的依赖项,该匹配器扩展了Jest。
在安装了我们的依赖关系后,我们将在我们的package.json 文件中指定一些变化。首先,当我们通过npm运行测试时,我们将使用Jest。此外,任何不是本地JavaScript的代码,在我们的例子中,是Svelte和ES6,将被转换,允许Jest访问它。
{
"scripts": {
"test": "jest src",
"test:watch": "npm run test -- --watch"
},
"jest": {
"transform": {
"^.+\\.js$": "babel-jest",
"^.+\\.svelte$": "svelte-jester"
},
"moduleFileExtensions": ["js", "svelte"]
}
}
接下来,在你项目的根目录下创建一个.babelrc 文件,并添加以下配置。
{
"presets": [["@babel/preset-env", {"targets": {"node": "current"}}]]
}
With our configurations completed, let’s perform a unit test on one of our components. In the lib folder where we placed the Counter component, create a test file called counter.spec.js and add the following code:
// src/lib/counter.spec.js
import '@testing-library/jest-dom';
import { render } from "@testing-library/svelte";
import Counter from "./counter.svelte";
describe("counter component", () => {
test("should confirm there are no images in the counter ", () => {
const { container } = render(Counter);
expect(container).not.toContainHTML("
");
});
});
```
```
上面的代码片段测试了`Counter` 组件中是否没有`
` 元素。在下面的视频中,我们正在运行一个单元测试,以指定`Counter` 组件没有任何图像的`npm run test` 命令。
[https://youtu.be/pbXI9OzFNQQ](https://youtu.be/pbXI9OzFNQQ)
你可以继续对我们应用程序中的其他组件运行单元测试,以确保它们按照预期工作。
使用Cypress对SvelteKit进行端到端测试
--------------------------
现在我们已经完成了单元测试,让我们来介绍一下端到端测试,这将使我们对我们的应用程序在现实生活中的工作情况有一些了解。对于端到端测试,我们将使用Cypress,一个基于JavaScript的测试框架。首先,让我们在终端用以下命令安装Cypress。
```
npm install cypress --save-dev
```
安装Cypress会在你的项目中创建一个额外的文件夹,其中包含以下一组演示测试套件。

一旦安装完成,通过终端用以下命令启动Cypress。
```
npx cypress open
```
上面的命令启动了Cypress的测试套件,它看起来像下面的图片。

在上面的图片中,我们可以看到,演示测试套件在安装时被创建。让我们删除现有的两个文件夹,创建我们自己的测试套件。导航到`cypress/integration` 文件夹,删除现有的两个文件夹,并创建一个新的文件夹,名为`giftcards` 。
在这个文件夹中,创建一个名为`giftcards.spec.js` 的测试文件。在这个文件中,我们将为礼品卡组件定义测试。
```
// cypress/integration.giftcards/giftcards.spec.js
const baseUrl = 'http://localhost:3000/giftcards';
describe('GiftCard Test', () => {
it('Confirms gift card data', () => {
cy.visit(baseUrl)
cy.get('.data').children().should('have.length', 336)
cy.get('.product_name').contains('Amazon Spain')
cy.get('.currency_code').should(($currency_code) => {
expect($currency_code).to.have.length(84)
expect($currency_code).to.contain('EUR')
expect($currency_code).to.contain('USD')
expect($currency_code).to.not.contain('GBP')
})
})
})
```
在上面的代码片段中,我们使用了Cypress的API中的一些命令来指定我们的端到端测试。基本上,我们的测试套件。
* 访问我们的礼品卡组件的URL
* 确认该组件中的元素总数为336个
* 确认在我们的礼品卡集合中存在一个名为`Amazon Spain` 的礼品卡
* 确认我们的平台上有84种不同的礼品卡可供销售
* 确认有欧元的货币面额
* 确认有美元的货币面值
* 确认没有英镑的货币面值
最后,让我们保存并重新启动测试套件。
[https://youtu.be/apOgg\_rgyHg](https://youtu.be/apOgg_rgyHg)
结论
--
集成测试是每个项目的重要和必要的部分,它可以确保你的应用程序在部署后能按预期运行。值得庆幸的是,正如我们在本教程中所展示的,测试你的SvelteKit应用程序是相当简单和直接的。我们涵盖了在SvelteKit中测试应用程序的一些基础知识,包括用Jest和Svelte测试库进行单元测试以及用Cypress进行端到端测试。
我希望你能喜欢这个教程!如果你推荐任何其他用于测试Svelte和SvelteKit应用程序的框架,请务必在下面留言。
[测试SvelteKit应用程序的介绍](https://blog.logrocket.com/intro-testing-sveltekit-applications/)》一文出现在[LogRocket博客](https://blog.logrocket.com)上。