学习目标
完成本单元后,您将能够:
- 列出用于有线服务的三个主要适配器。
- 解释有线服务的模拟数据。
- 了解反应变量及其影响。
测试@Wire服务
Lightning Web组件使用基于Lightning Data Service构建的电抗线服务来读取Salesforce数据。组件@wire
在其JavaScript类中使用以从lightning/ui*Api
模块中的一个有线适配器读取数据。
有线服务之所以具有响应性,部分原因是它支持响应变量。反应变量以开头$
。当电抗变量发生变化时,有线服务会提供新数据。如果数据存在于客户端缓存中,则可能不涉及网络请求。
我们使用@salesforce/sfdx-lwc-jest
测试实用程序来测试这些组件如何处理有线服务中的数据和错误。
测试要求您完全控制测试消耗的输入。不允许任何外部代码或数据依赖项。我们从中导入测试实用程序APIsfdx-lwc-jest
来模拟数据,因此我们的测试不依赖于不可预测的因素,例如远程调用或服务器延迟。
有三个用于模拟有线服务数据的适配器。
- 通用电线适配器:调用emit()API时,通用适配器会按需发出数据。它不包含有关数据本身的任何其他信息。
- 闪电数据服务(LDS)有线适配器:LDS适配器模仿闪电数据服务行为,并包含有关数据属性的信息。
- Apex电线适配器:Apex电线适配器模拟对Apex方法的调用,并包含任何错误状态。
让我们看一个典型的@wire
装饰器。使用命名的导入语法导入电线适配器。用装饰一个属性或函数,@wire
并指定电线适配器。每个有线适配器定义一个数据类型。
此代码将导入Account.Name字段,并在电线适配器的配置对象中使用它。
让我们仔细看看。
- 第8行使用
@wire
装饰器访问导入的getRecord
方法,并将反应$recordId
变量作为其第一个参数传递。第二个参数是Account.Name
对第3行中从架构导入的引用。 - 第9行可以是私有属性,也可以是从有线服务接收数据流的函数。如果是属性,则结果将返回到该属性的data属性或error属性。如果是函数,则结果将在具有data属性和error属性的对象中返回。
现在让我们看一下不同的适配器。
使用通用电线适配器
首先,我们将@wire
服务与CurrentPageReference一起使用。
闪电导航服务提供有线适配器和功能,以生成URL或导航到页面引用。我们将用于CurrentPageReference
获取对Salesforce中当前页面的引用并为其创建测试。
- 在Visual Studio Code中,右键单击该
lwc
文件夹,然后选择SFDX:Create Lightning Web Component。 - 输入
wireCPR
新组件的名称。 - 按Enter键。
- 按Enter 接受默认值
force-app/main/default/lwc
。 - 右键单击刚创建的
wireCPR
目录,然后选择“新建文件夹”。 - 输入
__tests__
。 - 按Enter键。
- 右键单击
__tests__
目录,然后选择“新建文件”。 - 输入
wireCPR.test.js
。 - 按Enter键。
- 在新文件中输入以下代码块:
- 保存文件并运行测试。
让我们仔细看看。
- 第3行和第4行有两个新导入:
CurrentPageReference
和registerTestWireAdapter
。 - 第7行抓取具有模拟
PageReference
数据的文件。我们尚未创建此文件,因此这是测试出错的第一个原因。 - 接下来,我们将解决此问题。
- 第10行,我们正在使用的
registerTestWireAdapter
与CurrentPageReference
进口的我们。这使我们可以在测试的稍后阶段对其进行模拟。 - 第32行是我们使用填充模拟数据的地方
emit()
。 - 第34行启动Promise,它希望将模拟数据更新到中
preElement
。
让我们创建测试数据文件并更新代码以使测试通过。首先,在目录下创建一个新目录__tests__
来存储模拟数据文件。
- 右键单击
__tests__
目录,然后选择“新建文件夹”。 - 输入
data
新目录的名称。 - 按Enter键。
- 右键单击
data
目录,然后选择“新建文件”。 - 输入
CurrentPageReference.json
。 - 按Enter键。
- 在新文件中输入以下json代码块:
- 保存文件并运行测试。
- 测试获取此错误消息。
优秀的。即使是失败的测试,也可以通过在处理代码时快速发现任何问题来促进进步。
接下来,我们添加HTML和JavaScript代码。
- 打开
wireCPR.html
。 - 在
template
标签内添加以下代码: - 保存文件。
- 打开
wireCPR.js
并用以下代码替换代码: - 保存文件并运行测试。
- 测试通过。
让我们看看发生了什么。使用@wire
适配器时,它将查找从服务返回的信息。我们需要创建该数据的模拟,以代替实际对服务的调用以获取数据。这样可以使我们仅测试当前拥有的项目,而不测试我们范围以外的项目。这也有助于保持测试速度。
使用闪电数据服务线适配器
接下来,我们使用@wire
闪电数据服务(LDS)。LDS使我们可以快速访问自定义和标准对象。我们的组件使用LDS从Salesforce获取数据并显示它。我们将创建测试以验证使用LDS适配器可以按预期显示数据。
- 在Visual Studio Code中创建一个新的Lightning Web组件。
- 将名称设置为
wireLDS
。 - 创建
__tests__
目录。 - 添加一个名为的测试文件
wireLDS.test.js
。 - 将代码添加到测试文件:
- 保存文件并运行测试。
- 由于我们接下来创建的缺少的模拟数据文件,测试失败。
在此之前,让我们看一下测试代码以了解发生了什么。
- 第3行和第4行有新的导入:
getRecord
和registerLdsTestWireAdapter
。
getRecord
来自LDS API。registerLdsTestWireAdapter
是用于LDS的特定Jest适配器。 - 第7行再次从目录中的
getRecord.json
文件中模拟数据data
。 - 第10行向LDS电线适配器注册,
getRecord
因此我们准备使用模拟数据。我们在第27行执行的操作。 - 行27个使用EMIT方法
getRecordAdapter
与mockGetRecord
作为参数。 - 第29行开始
Promise
返回,我们检查是否已使用模拟数据更新了各种元素。
接下来,我们创建模拟数据文件和其余文件以通过测试。在创建每个文件之后,我们运行测试以查看测试错误的进展,直到它们通过为止。
- 在
data
目录中创建__tests__
目录。 - 创建名为的测试数据文件
getRecord.json
。 - 添加以下代码:
- 保存文件并运行测试。
- 测试失败。
- 打开
wireLDS.html
并在模板标签之间输入以下代码: - 保存文件并运行测试。
- 测试再次失败,但是我们快到了。您只需要添加JavaScript控制器即可获取数据。
- 使用以下命令打开
wireLDS.js
并覆盖所有代码: - 保存文件并运行测试。
- 测试通过。
但是,如果获取数据时出现错误怎么办?您也可以对此进行测试。让我们在测试文件中添加一个新的describe块wireLDS.test.js
。
- 在describe’getRecord @wire data’块之后立即添加以下代码,使其位于describe’c-wire-lds’块内部。您可以嵌套描述块以帮助澄清测试。
- 保存文件并运行测试。
- 测试通过,因为您正在使用上的
error()
方法getRecordAdapter
。这将导致模拟数据出错,因此account.error
将为true。
使用Apex线适配器
接下来,让我们深入了解Apex,看看如何使用@wire
它进行测试。
LWC正在导入的Apex类被认为是需要模拟的外部连接。这意味着我们无需创建Apex类即可进行测试。我们需要做的只是模拟来自Apex调用的预期响应。在这种情况下,我们希望显示从Apex类返回的帐户。我们将创建测试,这些测试期望在返回帐户时显示帐户,并在没有返回消息的情况下显示消息。
让我们构建使用它的LWC。
- 在Visual Studio Code中创建一个新的Lightning Web组件。
- 将名称设置为
wireApex
。 - 创建
__tests__
目录。 - 添加一个名为的测试文件
wireApex.test.js
。 - 将以下代码添加到测试文件:
- 保存文件并运行测试。
- 您会因缺少的模拟数据文件而出错。
大多数代码是熟悉的。请注意,我们使用registerApexTestWireAdapter
代替Apex与Apex一起使用registerLdsTestWireAdapter
。jest.clearAllMocks()
清理代码中有一个新项目,用于重置测试之间的模拟。这是必需的,因为我们有两个模拟文件用于两个不同的测试。第一个测试正在寻找Apex调用以提供六个帐户。第二项测试是断言如果找不到帐户,将会发生什么情况。最后是测试,以断言如果Apex出错会发生什么情况。
让我们添加模拟数据文件和其余代码。
- 在
data
目录中创建__tests__
目录。 - 在
data
名为getAccountList.json
和的新目录中创建两个文件getAccountListNoRecords.json
。 - 在下面输入代码
getAccountList.json
: - 该
getAccountListNoRecords.json
文件将填充一个空白的JSON对象: - 现在,在
template
标记之间输入此代码wireApex.html
: - 通过使用以下代码替换完成
wireApex.js
:请注意,我们仅从 Apex类获取
getAccountList
方法AccountController
。请记住,该方法必须带有注释,@AuraEnabled(cacheable=true)
以使其与LWC一起使用。该@wire
用它来用一个函数error
或data
返回。 - 保存所有文件并运行测试。
- 测试通过。
在下一个单元中,您将处理其他组件的模拟,并完成使用Jest测试Lightning Web组件的方法。