测试据/h1>
当据code c-id="168.11.5.1">
@betway东盟体育app离子/角度据/code>
应用程序是使用Ionic CLI生成的,它是为应用程序的单元测试和端到betway东盟体育app端测试自动设置的。这与Angular CLI使用的设置相同。参考据a href="https://angular.io/guide/testing" target="_blank" c-id="168.14.5.3">
角度测试指南据/a>
查看测试Angular应用的详细信息。据/p>
测试原则据/a>
在测试应用程序时,最好记住,测试可以显示系统中是否存在缺陷。然而,不可能证明任何非平凡系统完全没有缺陷。因此,测试的目标不是验证代码是否正确,而是发现代码中的问题。这是一个微妙但重要的区别。据/p>
如果我们开始证明代码是正确的,我们更有可能坚持通过代码的快乐路径。如果我们开始发现问题,我们更有可能更有可能更全面锻炼代码并找到那里潜伏的错误。据/p>
最好从一开始就开始测试应用程序。这允许在过程的早期发现缺陷,此时它们更容易修复。这也允许在向系统添加新特性时对代码进行重构。据/p>
单元测试据/a>
单位测试练习单个代码(组件,页面,服务,管道等),隔离系统的其余部分。通过注入模拟对象来实现孤立,代替代码的依赖关系。模拟对象允许测试具有对依赖性输出的细粒度控制。模型还允许测试来确定已调用哪些依赖项以及已传递给它们的依赖项。据/p>
编写良好的单元测试的结构使得代码单元及其包含的功能可以通过据code c-id="168.44.5.1">
描述()据/code>
回调。代码单元及其特性的需求通过据code c-id="168.47.5.3">
它()据/code>
回调。当描述为据code c-id="168.50.5.5">
描述()据/code>
和据code c-id="168.53.5.7">
它()据/code>
回调是可读的,它们作为一个短语是有意义的。当嵌套的描述据code c-id="168.56.5.9">
描述()据/code>
和最后一个据code c-id="168.59.5.11">
它()据/code>
它们连接在一起,形成一个完整描述测试用例的句子。据/p>
由于单元测试以隔离锻炼代码,因此它们是快速,强大的,并且允许高度的代码覆盖范围。据/p>
使用模拟据/a>
单元测试练习孤立的代码模块。为了促进这一点,我们建议使用茉莉(据a href="https://jasmine.github.io/" title="https://jasmine.github.io/" c-id="168.74.5.1">
https://jasmine.github.io/据/a>
).Jasmine创建模拟对象(Jasmine称之为“间谍”)来代替测试时的依赖项。使用模拟对象时,测试可以控制对该依赖项的调用返回的值,从而使当前测试独立于对依赖项所做的更改。这也使得测试设置更容易,允许测试只涉及被测试模块中的代码。据/p>
使用模拟还允许测试查询模拟,以确定它是否被调用以及如何通过据code c-id="168.80.5.1">
toHaveBeenCalled *据/code>
的一组功能。测试应该尽可能具体地使用这些函数,以便调用据code c-id="168.83.5.3">
来不及据/code>
打电话给据code c-id="168.86.5.5">
被装据/code>
当测试某个方法是否已被调用时。就是据code c-id="168.89.5.7">
期望(mock.foo) .toHaveBeenCalledTimes (1)据/code>
比这更好据code c-id="168.92.5.9">
期望(mock.foo) .toHaveBeenCalled ()据/code>
. 当测试某个东西没有被调用时,应该遵循相反的建议(据code c-id="168.95.5.11">
期望(mock.foo) .not.toHaveBeenCalled ()据/code>
).据/p>
在Jasmine中创建模拟对象有两种常见的方法据code c-id="168.101.5.1">
jasmine.createspy.据/code>
和据code c-id="168.104.5.3">
jasmine.createspyobj.据/code>
或者可以使用将间谍安装到现有对象上据code c-id="168.107.5.5">
spyOn ()据/code>
和据code c-id="168.110.5.7">
SpyonProperty()据/code>
。据/p>
使用据code c-id="168.118.6.1">
jasmine.createspy.据/code>
和据code c-id="168.121.6.3">
jasmine.createspyobj.据/code>
jasmine.createspyobj.据/code>
使用创建时定义的一组模拟方法从头创建完整的模拟对象。这很有用,因为它非常简单。不需要在测试中构造或注入任何内容。使用此函数的缺点是,它允许创建可能与真实对象不匹配的对象。据/p>
jasmine.createspy.据/code>
类似,但它创建了一个独立的模拟函数。据/p>
使用据code c-id="168.139.6.1">
spyOn ()据/code>
和据code c-id="168.142.6.3">
SpyonProperty()据/code>
spyOn ()据/code>
在现有对象上安装spy。使用此技术的优点是,如果尝试在对象上不存在的方法上进行spy,则会引发异常。这会防止测试模拟不存在的方法。缺点是测试需要一个完全格式的对象,这可能会增加所需的测试设置量。据/p>
SpyonProperty()据/code>
相似,但不同的是它监视的是属性而不是方法。据/p>
通用测试结构据/a>
单元测试包含在据code c-id="168.164.5.1">
规范据/code>
文件与一个据code c-id="168.167.5.3">
规范据/code>
每个实体文件(组件,页面,服务,管道等)。这据code c-id="168.170.5.5">
规范据/code>
文件与测试源并排运行,并以测试源命名。例如,如果项目有一个名为WeatherService的服务,则其代码位于名为据code c-id="168.173.5.7">
weather.service.ts据/code>
将测试放在名为据code c-id="168.176.5.9">
天气.service.spec.ts.据/code>
。这两个文件都在同一文件夹中。据/p>
这据code c-id="168.182.5.1">
规范据/code>
文件本身包含一个据code c-id="168.185.5.3">
描述据/code>
呼叫定义整体测试。嵌套在它内是其他据code c-id="168.188.5.5">
描述据/code>
定义主要功能区域的调用。每一个据code c-id="168.191.5.7">
描述据/code>
呼叫可以包含设置和拆除代码(通常通过据code c-id="168.194.5.9">
摘要据/code>
和据code c-id="168.197.5.11">
之后据/code>
电话),更多据code c-id="168.200.5.13">
描述据/code>
调用形成功能的分层崩溃,以及据code c-id="168.203.5.15">
信息技术据/code>
定义单个测试用例的调用。据/p>
这据code c-id="168.209.5.1">
描述据/code>
和据code c-id="168.212.5.3">
信息技术据/code>
调用还包含描述性文本标签。在格式良好的测试中据code c-id="168.215.5.5">
描述据/code>
和据code c-id="168.218.5.7">
信息技术据/code>
调用与它们的标签相结合,以执行适当的短语和每个测试用例的完整标签,这些测试用例由据code c-id="168.221.5.9">
描述据/code>
和据code c-id="168.224.5.11">
信息技术据/code>
标签,创建一个完整的句子。据/p>
例如:据/p>
描述据/span>
(据/span>
“计算”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
描述据/span>
(据/span>
“分割”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
信息技术据/span>
(据/span>
'正确计算4 / 2 '据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'懦弱地拒绝归零'据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
}据/span>
)据/span>
;据/span>
...据/span>
}据/span>
)据/span>
;据/span>
描述据/span>
(据/span>
“倍增”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
...据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
外层据code c-id="168.373.5.1">
描述据/code>
调用声明据code c-id="168.376.5.3">
计算据/code>
服务正在测试中,内部据code c-id="168.379.5.5">
描述据/code>
调用准确地说明正在测试的功能,以及据code c-id="168.382.5.7">
信息技术据/code>
呼叫状态测试用例是什么。运行每个测试用例的完整标签是一个有道理的句子(计算划分懦弱拒绝除以零)。据/p>
页面和组件据/a>
页面只是有角度的组件。因此,页面和组件都使用据a href="https://angular.io/guide/testing" c-id="168.394.5.1">
角度的组件测试据/a>
指导方针据/p>
由于页面和组件包含标注代码和HTML模板标记,因此可以执行组件类测试和组件DOM测试。创建页面时,生成的模板测试如下所示:据/p>
进口据/span>
{据/span>
custom_elements_schema.据/span>
}据/span>
从据/span>
'@ Angular / Core'据/span>
;据/span>
进口据/span>
{据/span>
异步的据/span>
那据/span>
部件夹具据span class="token punctuation" c-id="168.436.7.20">
那据/span>
测试用据span class="token punctuation" c-id="168.439.7.22">
}据/span>
从据/span>
'@ Angular /核心/测试'据/span>
;据/span>
进口据/span>
{据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.456.7.33">
}据/span>
从据/span>
“/制表符。第页”据/span>
;据/span>
描述据/span>
(据/span>
'tabspage'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
成分据span class="token operator" c-id="168.490.7.54">
:据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.493.7.56">
;据/span>
允许据/span>
夹具据span class="token operator" c-id="168.499.7.60">
:据/span>
部件夹具据span class="token operator" c-id="168.502.7.62">
据据/span>
塔布斯帕奇据span class="token operator" c-id="168.505.7.64">
>据/span>
;据/span>
摘要据/span>
(据/span>
异步的据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.528.7.78">
。据/span>
配置测试模块据/span>
(据/span>
{据/span>
声明据span class="token operator" c-id="168.537.7.83">
:据/span>
[据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.543.7.87">
]据/span>
那据/span>
模式据span class="token operator" c-id="168.548.7.90">
:据/span>
[据/span>
custom_elements_schema.据/span>
]据/span>
那据/span>
}据/span>
)据/span>
。据/span>
编译组件据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
夹具据span class="token operator" c-id="168.597.7.118">
=据/span>
测试用据span class="token punctuation" c-id="168.600.7.120">
。据/span>
创建组件据/span>
(据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.607.7.124">
)据/span>
;据/span>
成分据span class="token operator" c-id="168.612.7.127">
=据/span>
夹具据span class="token punctuation" c-id="168.615.7.129">
。据/span>
componentInstance据span class="token punctuation" c-id="168.618.7.131">
;据/span>
夹具据span class="token punctuation" c-id="168.621.7.133">
。据/span>
检测变化据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“应该创建”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
成分据span class="token punctuation" c-id="168.664.7.158">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
进行组件类测试时,使用通过定义的组件对象访问组件对象据code c-id="168.694.5.1">
组件=fixture.componentInstance;据/code>
. 这是component类的一个实例。在进行DOM测试时据code c-id="168.697.5.3">
1.nativeElement据/code>
使用属性。这是实际的据code c-id="168.700.5.5">
HTMLElement据/code>
,它允许测试使用标准的HTML API方法,例如据code c-id="168.703.5.7">
HtmleElement.querySelector据/code>
为了检查DOM。据/p>
服务据/a>
服务通常分为两大类:执行计算和其他操作的实用服务,以及主要执行HTTP操作和数据操作的数据服务。据/p>
基本服务测试据/a>
测试大多数服务的建议方法是实例化该服务,并为该服务具有的任何依赖项手动注入mock。这样,就可以对代码进行隔离测试。据/p>
假设有一个服务具有一个方法,该方法获取一组时间卡并计算净工资。我们还假设税务计算是通过当前服务所依赖的另一个服务处理的。此工资单服务可以这样进行测试:据/p>
进口据/span>
{据/span>
PayrollService据span class="token punctuation" c-id="168.738.7.4">
}据/span>
从据/span>
'./payroll.service'据/span>
;据/span>
描述据/span>
(据/span>
“付费服务”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
服务据span class="token operator" c-id="168.772.7.25">
:据/span>
PayrollService据span class="token punctuation" c-id="168.775.7.27">
;据/span>
允许据/span>
TaxServicespy.据span class="token punctuation" c-id="168.781.7.31">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
TaxServicespy.据span class="token operator" c-id="168.799.7.42">
=据/span>
茉莉花据span class="token punctuation" c-id="168.802.7.44">
。据/span>
createSpyObj据/span>
(据/span>
“TaxService”据/span>
那据/span>
{据/span>
联邦林彗星据span class="token operator" c-id="168.816.7.52">
:据/span>
0.据/span>
那据/span>
StateIncometax.据span class="token operator" c-id="168.824.7.57">
:据/span>
0.据/span>
那据/span>
社会安全据span class="token operator" c-id="168.832.7.62">
:据/span>
0.据/span>
那据/span>
医疗保险据span class="token operator" c-id="168.840.7.67">
:据/span>
0.据/span>
}据/span>
)据/span>
;据/span>
服务据span class="token operator" c-id="168.853.7.75">
=据/span>
刚出现的据/span>
PayrollService据/span>
(据/span>
TaxServicespy.据span class="token punctuation" c-id="168.864.7.82">
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
描述据/span>
(据/span>
“净薪酬计算”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
...据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
这允许测试通过模拟设置来控制各种税收计算返回的值,例如据code c-id="168.916.5.1">
TaxServicespy.FederalIncometax.and.ReturnValue(73.24)据/code>
. 这允许“净工资”测试独立于税收计算逻辑。当税务代码更改时,只需更改与税务服务相关的代码和测试。净工资测试可以继续按原样运行,因为这些测试不关心如何计算税收,只关心正确应用价值。据/p>
通过服务产生时使用的脚手架据code c-id="168.922.5.1">
betway东盟体育app离子G服务名称据/code>
使用Angular的测试实用程序并设置测试模块。这样做并非绝对必要。但是,该代码可以保留在中,从而允许手动构建或注入服务:据/p>
进口据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.936.7.4">
那据/span>
注射据span class="token punctuation" c-id="168.939.7.6">
}据/span>
从据/span>
'@ Angular /核心/测试'据/span>
;据/span>
进口据/span>
{据/span>
PayrollService据span class="token punctuation" c-id="168.956.7.17">
}据/span>
从据/span>
'./payroll.service'据/span>
;据/span>
进口据/span>
{据/span>
税务局据span class="token punctuation" c-id="168.973.7.28">
}据/span>
从据/span>
”。/ tax.service '据/span>
;据/span>
描述据/span>
(据/span>
“PayrolService”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
TaxServicespy.据span class="token punctuation" c-id="168.1007.7.49">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
TaxServicespy.据span class="token operator" c-id="168.1025.7.60">
=据/span>
茉莉花据span class="token punctuation" c-id="168.1028.7.62">
。据/span>
createSpyObj据/span>
(据/span>
“TaxService”据/span>
那据/span>
{据/span>
联邦林彗星据span class="token operator" c-id="168.1042.7.70">
:据/span>
0.据/span>
那据/span>
StateIncometax.据span class="token operator" c-id="168.1050.7.75">
:据/span>
0.据/span>
那据/span>
社会安全据span class="token operator" c-id="168.1058.7.80">
:据/span>
0.据/span>
那据/span>
医疗保险据span class="token operator" c-id="168.1066.7.85">
:据/span>
0.据/span>
}据/span>
)据/span>
;据/span>
测试用据span class="token punctuation" c-id="168.1079.7.93">
。据/span>
配置测试模块据/span>
(据/span>
{据/span>
提供者据span class="token operator" c-id="168.1088.7.98">
:据/span>
[据/span>
PayrollService据span class="token punctuation" c-id="168.1094.7.102">
那据/span>
{据/span>
提供据span class="token operator" c-id="168.1100.7.106">
:据/span>
税务局据span class="token punctuation" c-id="168.1103.7.108">
那据/span>
使用价值据span class="token operator" c-id="168.1106.7.110">
:据/span>
TaxServicespy.据span class="token punctuation" c-id="168.1109.7.112">
}据/span>
]据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'在注入位置进行测试'据/span>
那据/span>
注射据/span>
(据/span>
[据/span>
PayrollService据span class="token punctuation" c-id="168.1145.7.133">
]据/span>
那据/span>
(据/span>
服务据span class="token operator" c-id="168.1154.8.1">
:据/span>
PayrollService据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
服务据span class="token punctuation" c-id="168.1171.7.147">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'在手动构建的位置进行一些测试'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
常量据/span>
服务据span class="token operator" c-id="168.1217.7.174">
=据/span>
刚出现的据/span>
PayrollService据/span>
(据/span>
TaxServicespy.据span class="token punctuation" c-id="168.1228.7.181">
)据/span>
;据/span>
预计据/span>
(据/span>
服务据span class="token punctuation" c-id="168.1238.7.187">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
测试HTTP数据服务据/a>
执行HTTP操作的大多数服务将使用角度的HTTPClient服务来执行这些操作。对于这样的测试,建议使用角度据code c-id="168.1274.5.1">
HttpClientTestingModule据/code>
. 有关此模块的详细文档,请参阅Angular's据a href="https://angular.io/guide/http" target="_blank" c-id="168.1277.5.3">
Angular测试HTTP请求据/a>
指南。据/p>
此类测试的此基本设置如下所示:据/p>
进口据/span>
{据/span>
HttpBackend据span class="token punctuation" c-id="168.1294.7.4">
那据/span>
httpclient.据span class="token punctuation" c-id="168.1297.7.6">
}据/span>
从据/span>
“@angular/common/http”据/span>
;据/span>
进口据/span>
{据/span>
HttpTestingController据span class="token punctuation" c-id="168.1314.7.17">
那据/span>
HttpClientTestingModule据span class="token punctuation" c-id="168.1317.7.19">
}据/span>
从据/span>
“@angular /共同/ http /测试”据/span>
;据/span>
进口据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.1334.7.30">
那据/span>
注射据span class="token punctuation" c-id="168.1337.7.32">
}据/span>
从据/span>
'@ Angular /核心/测试'据/span>
;据/span>
进口据/span>
{据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1354.7.43">
}据/span>
从据/span>
“./iss跟踪数据。服务”据/span>
;据/span>
描述据/span>
(据/span>
“IsTrackingDataService”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
httpClient据span class="token operator" c-id="168.1388.7.64">
:据/span>
httpclient.据span class="token punctuation" c-id="168.1391.7.66">
;据/span>
允许据/span>
httpTestingController据span class="token operator" c-id="168.1397.7.70">
:据/span>
HttpTestingController据span class="token punctuation" c-id="168.1400.7.72">
;据/span>
允许据/span>
ISTrackingDataService据span class="token operator" c-id="168.1406.7.76">
:据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1409.7.78">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.1427.7.89">
。据/span>
配置测试模块据/span>
(据/span>
{据/span>
进口据span class="token operator" c-id="168.1436.7.94">
:据/span>
[据/span>
HttpClientTestingModule据span class="token punctuation" c-id="168.1442.7.98">
]据/span>
那据/span>
提供者据span class="token operator" c-id="168.1447.7.101">
:据/span>
[据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1453.7.105">
]据/span>
}据/span>
)据/span>
;据/span>
httpClient据span class="token operator" c-id="168.1463.7.111">
=据/span>
测试用据span class="token punctuation" c-id="168.1466.7.113">
。据/span>
得到据/span>
(据/span>
httpclient.据span class="token punctuation" c-id="168.1473.7.117">
)据/span>
;据/span>
httpTestingController据span class="token operator" c-id="168.1478.7.120">
=据/span>
测试用据span class="token punctuation" c-id="168.1481.7.122">
。据/span>
得到据/span>
(据/span>
HttpTestingController据span class="token punctuation" c-id="168.1488.7.126">
)据/span>
;据/span>
ISTrackingDataService据span class="token operator" c-id="168.1493.7.129">
=据/span>
刚出现的据/span>
ISTrackingDataService据/span>
(据/span>
httpClient据span class="token punctuation" c-id="168.1504.7.136">
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“存在”据/span>
那据/span>
注射据/span>
(据/span>
[据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1532.7.152">
]据/span>
那据/span>
(据/span>
服务据span class="token operator" c-id="168.1541.8.1">
:据/span>
ISTrackingDataService据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
服务据span class="token punctuation" c-id="168.1558.7.166">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
)据/span>
;据/span>
描述据/span>
(据/span>
“位置”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
信息技术据/span>
(据/span>
'现在获取ISS的位置'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1620.7.202">
。据/span>
位置据/span>
(据/span>
)据/span>
。据/span>
订阅据/span>
(据/span>
X据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
X据span class="token punctuation" c-id="168.1648.7.218">
)据/span>
。据/span>
toequal.据/span>
(据/span>
{据/span>
经度据span class="token operator" c-id="168.1659.7.224">
:据/span>
-据/span>
138.1719据/span>
那据/span>
纬度据span class="token operator" c-id="168.1669.7.230">
:据/span>
44.4423据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
常量据/span>
雷据span class="token operator" c-id="168.1692.7.244">
=据/span>
httpTestingController据span class="token punctuation" c-id="168.1695.7.246">
。据/span>
威慑据/span>
(据/span>
'http://api.open-notify.org/iss-now.json'据/span>
)据/span>
;据/span>
预计据/span>
(据/span>
雷据span class="token punctuation" c-id="168.1715.7.258">
。据/span>
要求据span class="token punctuation" c-id="168.1718.7.260">
。据/span>
方法据span class="token punctuation" c-id="168.1721.7.262">
)据/span>
。据/span>
toequal.据/span>
(据/span>
“得到”据/span>
)据/span>
;据/span>
雷据span class="token punctuation" c-id="168.1736.7.270">
。据/span>
冲洗据/span>
(据/span>
{据/span>
iss_位置据span class="token operator" c-id="168.1745.7.275">
:据/span>
{据/span>
经度据span class="token operator" c-id="168.1751.7.279">
:据/span>
'-138.1719'据/span>
那据/span>
纬度据span class="token operator" c-id="168.1759.7.284">
:据/span>
'44.4423'据/span>
}据/span>
那据/span>
时间戳据span class="token operator" c-id="168.1770.7.291">
:据/span>
1525950644.据/span>
那据/span>
信息据span class="token operator" c-id="168.1778.7.296">
:据/span>
“成功”据/span>
}据/span>
)据/span>
;据/span>
httpTestingController据span class="token punctuation" c-id="168.1791.7.304">
。据/span>
验证据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
管据/a>
管道类似于具有特定定义接口的服务。它是一个包含一个公共方法的类,据code c-id="168.1832.5.1">
使改变据/code>
,它操纵输入值(和其他可选参数),以便创建页面上呈现的输出。要测试管道:实例化管道,调用变换方法,并验证结果。据/p>
作为一个简单的例子,让我们看一个使用据code c-id="168.1838.5.1">
人据/code>
对象并格式化名称。为了简单起见,让我们说一个据code c-id="168.1841.5.3">
人据/code>
包括A.据code c-id="168.1844.5.5">
身份证件据/code>
那据code c-id="168.1847.5.7">
名字据/code>
那据code c-id="168.1850.5.9">
姓据/code>
和据code c-id="168.1853.5.11">
中间初始据/code>
. 管道的要求是将名称打印为“Last,First M”。处理不存在名字、姓氏或中间首字母的情况。这样的测试可能如下所示:据/p>
进口据/span>
{据/span>
NamePipe据span class="token punctuation" c-id="168.1867.7.4">
}据/span>
从据/span>
'./name.pipe'据/span>
;据/span>
进口据/span>
{据/span>
人据span class="token punctuation" c-id="168.1884.7.15">
}据/span>
从据/span>
'../../models/person'据/span>
;据/span>
描述据/span>
(据/span>
“NamePipe”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
管据span class="token operator" c-id="168.1918.7.36">
:据/span>
NamePipe据span class="token punctuation" c-id="168.1921.7.38">
;据/span>
允许据/span>
testPerson据span class="token operator" c-id="168.1927.7.42">
:据/span>
人据span class="token punctuation" c-id="168.1930.7.44">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
管据span class="token operator" c-id="168.1948.7.55">
=据/span>
刚出现的据/span>
NamePipe据/span>
(据/span>
)据/span>
;据/span>
testPerson据span class="token operator" c-id="168.1963.7.64">
=据/span>
{据/span>
身份证件据span class="token operator" c-id="168.1969.7.68">
:据/span>
42据/span>
那据/span>
名字据span class="token operator" c-id="168.1977.7.73">
:据/span>
“道格拉斯。”据/span>
那据/span>
姓据span class="token operator" c-id="168.1985.7.78">
:据/span>
“亚当斯”据/span>
那据/span>
中间初始据span class="token operator" c-id="168.1993.7.83">
:据/span>
'n'据/span>
}据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“存在”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2036.7.109">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“正确设置全名格式”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2081.7.135">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2088.7.139">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“道格拉斯亚当斯,N。”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'没有中间首字母的手柄'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
删去据/span>
testPerson据span class="token punctuation" c-id="168.2135.7.166">
。据/span>
中间初始据span class="token punctuation" c-id="168.2138.7.168">
;据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2146.7.173">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2153.7.177">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“亚当斯,道格拉斯”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'处理没有名字'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
删去据/span>
testPerson据span class="token punctuation" c-id="168.2200.7.204">
。据/span>
名字据span class="token punctuation" c-id="168.2203.7.206">
;据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2211.7.211">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2218.7.215">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“亚当斯N。”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“没有姓氏的句柄”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
删去据/span>
testPerson据span class="token punctuation" c-id="168.2265.7.242">
。据/span>
姓据span class="token punctuation" c-id="168.2268.7.244">
;据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2276.7.249">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2283.7.253">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“道格拉斯N.”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
在使用管道的组件和页面中通过DOM测试来练习管道也是有益的。据/p>
端到端测试据/a>
端到端测试用于验证应用程序作为一个整体工作,通常包括与实时数据的连接。单元测试专注于独立的代码单元,因此允许对应用程序逻辑进行低级测试,而端到端测试则专注于各种用户故事或使用场景,提供对整个应用程序数据流的高级测试。单元测试试图发现应用程序逻辑的问题,而端到端测试则试图发现当这些单个单元一起使用时发生的问题。端到端测试揭示了应用程序的整体架构的问题。据/p>
由于端到端测试测试用户故事,并将应用程序作为一个整体而不是单独的代码模块进行覆盖,因此端到端测试除了主应用程序本身的代码外,还存在于项目中自己的应用程序中。大多数端到端测试是通过自动化与应用程序的普通用户交互并检查DOM来确定这些交互的结果来进行的。据/p>
测试结构据/a>
当据code c-id="168.2338.5.1">
@betway东盟体育app离子/角度据/code>
中生成的端到端默认测试应用程序据code c-id="168.2341.5.3">
e2e据/code>
文件夹。此应用程序使用据a href="" c-id="168.2344.5.5">
量角器据/a>
要控制浏览器和据a href="" c-id="168.2347.5.7">
茉莉花据/a>
组织和执行测试。该应用程序最初由四个文件组成:据/p>
progrator.conf.js据/code>
—量角器配置文件据/li>
tsconfig.e2e.json据/code>
- 测试应用程序的特定打字配置据/li>
src/app.po.ts据/code>
-一个页面对象,包含导航应用程序、DOM中的查询元素和页面上的manInput元素的方法据/li>
src/app.e2e-spec.ts据/code>
-测试脚本据/li>
页面对象据/a>
端到端测试通过自动化与应用程序的常见用户交互、等待应用程序响应以及检查DOM以确定交互结果来运行。这涉及到大量的DOM操作和检查。如果这些都是手工完成的,测试将非常脆弱,难以阅读和维护。据/p>
页面对象将单个页面的HTML封装在TypeScript类中,提供测试脚本用于与应用程序交互的API。在页面对象中封装DOM操作逻辑使测试更具可读性,更易于推理,从而降低了测试的维护成本。创建精心设计的页面对象是创建高质量和可维护的端到端测试的关键。据/p>
基本页对象据/a>
许多测试依赖于一些操作,例如等待页面可见、在输入中输入文本以及单击按钮。用于执行此操作的方法仅与用于更改适当DOM元素的CSS选择器保持一致。因此,将此逻辑抽象为可由其他页面对象使用的基类是有意义的。据/p>
下面的示例实现了所有页面对象都需要支持的一些基本方法。据/p>
进口据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2408.7.4">
那据/span>
经过据span class="token punctuation" c-id="168.2411.7.6">
那据/span>
要素据span class="token punctuation" c-id="168.2414.7.8">
那据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2417.7.10">
}据/span>
从据/span>
“量角器”据/span>
;据/span>
出口据/span>
班级据/span>
pageObjectBase.据/span>
{据/span>
私人的据/span>
小路据span class="token operator" c-id="168.2443.7.27">
:据/span>
字符串据/span>
;据/span>
保护据/span>
标签据span class="token operator" c-id="168.2454.7.34">
:据/span>
字符串据/span>
;据/span>
建造师据/span>
(据/span>
标签据span class="token operator" c-id="168.2468.8.1">
:据/span>
字符串据/span>
那据/span>
小路据span class="token operator" c-id="168.2476.8.6">
:据/span>
字符串据/span>
)据/span>
{据/span>
这据/span>
。据/span>
标签据span class="token operator" c-id="168.2492.7.49">
=据/span>
标签据span class="token punctuation" c-id="168.2495.7.51">
;据/span>
这据/span>
。据/span>
小路据span class="token operator" c-id="168.2503.7.56">
=据/span>
小路据span class="token punctuation" c-id="168.2506.7.58">
;据/span>
}据/span>
加载据/span>
(据/span>
)据/span>
{据/span>
回来据/span>
浏览器据span class="token punctuation" c-id="168.2525.7.70">
。据/span>
得到据/span>
(据/span>
这据/span>
。据/span>
小路据span class="token punctuation" c-id="168.2536.7.76">
)据/span>
;据/span>
}据/span>
rootElement据/span>
(据/span>
)据/span>
{据/span>
回来据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2562.7.92">
。据/span>
css据/span>
(据/span>
这据/span>
。据/span>
标签据span class="token punctuation" c-id="168.2573.7.98">
)据/span>
)据/span>
;据/span>
}据/span>
waitunilitinvisible.据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2593.7.110">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2600.7.114">
。据/span>
隐形据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
waitUntilPresent据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2641.7.137">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2648.7.141">
。据/span>
presence据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
waitunilnotpresent.据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2689.7.164">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2696.7.168">
。据/span>
不据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2703.7.172">
。据/span>
presence据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
waitulilvisible.据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2747.7.197">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2754.7.201">
。据/span>
visibilityOf据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
盖蒂特尔据/span>
(据/span>
)据/span>
{据/span>
回来据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2803.7.229">
。据/span>
css据/span>
(据/span>
`据/span>
$ {据/span>
这据/span>
。据/span>
标签据span class="token interpolation-punctuation punctuation" c-id="168.2820.9.4">
}据/span>
离子标题据/span>
`据/span>
)据/span>
)据/span>
。据/span>
getText据/span>
(据/span>
)据/span>
;据/span>
}据/span>
保护据/span>
输入文本据/span>
(据/span>
sel据span class="token operator" c-id="168.2853.8.1">
:据/span>
字符串据/span>
那据/span>
文本据span class="token operator" c-id="168.2861.8.6">
:据/span>
字符串据/span>
)据/span>
{据/span>
常量据/span>
el据span class="token operator" c-id="168.2875.7.254">
=据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2883.7.259">
。据/span>
css据/span>
(据/span>
`据/span>
$ {据/span>
这据/span>
。据/span>
标签据span class="token interpolation-punctuation punctuation" c-id="168.2900.9.4">
}据/span>
$ {据/span>
sel据span class="token interpolation-punctuation punctuation" c-id="168.2907.9.2">
}据/span>
`据/span>
)据/span>
)据/span>
;据/span>
常量据/span>
磷化铟据span class="token operator" c-id="168.2921.7.269">
=据/span>
el据span class="token punctuation" c-id="168.2924.7.271">
。据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2931.7.275">
。据/span>
css据/span>
(据/span>
'输入'据/span>
)据/span>
)据/span>
;据/span>
磷化铟据span class="token punctuation" c-id="168.2946.7.283">
。据/span>
发送键据/span>
(据/span>
文本据span class="token punctuation" c-id="168.2953.7.287">
)据/span>
;据/span>
}据/span>
保护据/span>
enterTextareaText据/span>
(据/span>
sel据span class="token operator" c-id="168.2970.8.1">
:据/span>
字符串据/span>
那据/span>
文本据span class="token operator" c-id="168.2978.8.6">
:据/span>
字符串据/span>
)据/span>
{据/span>
常量据/span>
el据span class="token operator" c-id="168.2992.7.303">
=据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.3000.7.308">
。据/span>
css据/span>
(据/span>
`据/span>
$ {据/span>
这据/span>
。据/span>
标签据span class="token interpolation-punctuation punctuation" c-id="168.3017.9.4">
}据/span>
$ {据/span>
sel据span class="token interpolation-punctuation punctuation" c-id="168.3024.9.2">
}据/span>
`据/span>
)据/span>
)据/span>
;据/span>
常量据/span>
磷化铟据span class="token operator" c-id="168.3038.7.318">
=据/span>
el据span class="token punctuation" c-id="168.3041.7.320">
。据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.3048.7.324">
。据/span>
css据/span>
(据/span>
“文本区域”据/span>
)据/span>
)据/span>
;据/span>
磷化铟据span class="token punctuation" c-id="168.3063.7.332">
。据/span>
发送键据/span>
(据/span>
文本据span class="token punctuation" c-id="168.3070.7.336">
)据/span>
;据/span>
}据/span>
保护据/span>
点击按钮据/span>
(据/span>
sel据span class="token operator" c-id="168.3087.8.1">
:据/span>
字符串据/span>
)据/span>
{据/span>
常量据/span>
el据span class="token operator" c-id="168.3101.7.352">
=据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.3109.7.357">
。据/span>
css据/span>
当据code c-id="168.11.5.1"> @betway东盟体育app离子/角度据/code> 应用程序是使用Ionic CLI生成的,它是为应用程序的单元测试和端到betway东盟体育app端测试自动设置的。这与Angular CLI使用的设置相同。参考据a href="https://angular.io/guide/testing" target="_blank" c-id="168.14.5.3"> 角度测试指南据/a> 查看测试Angular应用的详细信息。据/p>
测试原则据/a>
在测试应用程序时,最好记住,测试可以显示系统中是否存在缺陷。然而,不可能证明任何非平凡系统完全没有缺陷。因此,测试的目标不是验证代码是否正确,而是发现代码中的问题。这是一个微妙但重要的区别。据/p>
如果我们开始证明代码是正确的,我们更有可能坚持通过代码的快乐路径。如果我们开始发现问题,我们更有可能更有可能更全面锻炼代码并找到那里潜伏的错误。据/p>
最好从一开始就开始测试应用程序。这允许在过程的早期发现缺陷,此时它们更容易修复。这也允许在向系统添加新特性时对代码进行重构。据/p>
单元测试据/a>
单位测试练习单个代码(组件,页面,服务,管道等),隔离系统的其余部分。通过注入模拟对象来实现孤立,代替代码的依赖关系。模拟对象允许测试具有对依赖性输出的细粒度控制。模型还允许测试来确定已调用哪些依赖项以及已传递给它们的依赖项。据/p>
编写良好的单元测试的结构使得代码单元及其包含的功能可以通过据code c-id="168.44.5.1"> 描述()据/code> 回调。代码单元及其特性的需求通过据code c-id="168.47.5.3"> 它()据/code> 回调。当描述为据code c-id="168.50.5.5"> 描述()据/code> 和据code c-id="168.53.5.7"> 它()据/code> 回调是可读的,它们作为一个短语是有意义的。当嵌套的描述据code c-id="168.56.5.9"> 描述()据/code> 和最后一个据code c-id="168.59.5.11"> 它()据/code> 它们连接在一起,形成一个完整描述测试用例的句子。据/p>
由于单元测试以隔离锻炼代码,因此它们是快速,强大的,并且允许高度的代码覆盖范围。据/p>
使用模拟据/a>
单元测试练习孤立的代码模块。为了促进这一点,我们建议使用茉莉(据a href="https://jasmine.github.io/" title="https://jasmine.github.io/" c-id="168.74.5.1"> https://jasmine.github.io/据/a> ).Jasmine创建模拟对象(Jasmine称之为“间谍”)来代替测试时的依赖项。使用模拟对象时,测试可以控制对该依赖项的调用返回的值,从而使当前测试独立于对依赖项所做的更改。这也使得测试设置更容易,允许测试只涉及被测试模块中的代码。据/p>
使用模拟还允许测试查询模拟,以确定它是否被调用以及如何通过据code c-id="168.80.5.1"> toHaveBeenCalled *据/code> 的一组功能。测试应该尽可能具体地使用这些函数,以便调用据code c-id="168.83.5.3"> 来不及据/code> 打电话给据code c-id="168.86.5.5"> 被装据/code> 当测试某个方法是否已被调用时。就是据code c-id="168.89.5.7"> 期望(mock.foo) .toHaveBeenCalledTimes (1)据/code> 比这更好据code c-id="168.92.5.9"> 期望(mock.foo) .toHaveBeenCalled ()据/code> . 当测试某个东西没有被调用时,应该遵循相反的建议(据code c-id="168.95.5.11"> 期望(mock.foo) .not.toHaveBeenCalled ()据/code> ).据/p>
在Jasmine中创建模拟对象有两种常见的方法据code c-id="168.101.5.1"> jasmine.createspy.据/code> 和据code c-id="168.104.5.3"> jasmine.createspyobj.据/code> 或者可以使用将间谍安装到现有对象上据code c-id="168.107.5.5"> spyOn ()据/code> 和据code c-id="168.110.5.7"> SpyonProperty()据/code> 。据/p>
使用据code c-id="168.118.6.1"> jasmine.createspy.据/code> 和据code c-id="168.121.6.3"> jasmine.createspyobj.据/code>
单元测试包含在据code c-id="168.164.5.1">
规范据/code>
文件与一个据code c-id="168.167.5.3">
规范据/code>
每个实体文件(组件,页面,服务,管道等)。这据code c-id="168.170.5.5">
规范据/code>
文件与测试源并排运行,并以测试源命名。例如,如果项目有一个名为WeatherService的服务,则其代码位于名为据code c-id="168.173.5.7">
weather.service.ts据/code>
将测试放在名为据code c-id="168.176.5.9">
天气.service.spec.ts.据/code>
。这两个文件都在同一文件夹中。据/p>
这据code c-id="168.182.5.1">
规范据/code>
文件本身包含一个据code c-id="168.185.5.3">
描述据/code>
呼叫定义整体测试。嵌套在它内是其他据code c-id="168.188.5.5">
描述据/code>
定义主要功能区域的调用。每一个据code c-id="168.191.5.7">
描述据/code>
呼叫可以包含设置和拆除代码(通常通过据code c-id="168.194.5.9">
摘要据/code>
和据code c-id="168.197.5.11">
之后据/code>
电话),更多据code c-id="168.200.5.13">
描述据/code>
调用形成功能的分层崩溃,以及据code c-id="168.203.5.15">
信息技术据/code>
定义单个测试用例的调用。据/p>
这据code c-id="168.209.5.1">
描述据/code>
和据code c-id="168.212.5.3">
信息技术据/code>
调用还包含描述性文本标签。在格式良好的测试中据code c-id="168.215.5.5">
描述据/code>
和据code c-id="168.218.5.7">
信息技术据/code>
调用与它们的标签相结合,以执行适当的短语和每个测试用例的完整标签,这些测试用例由据code c-id="168.221.5.9">
描述据/code>
和据code c-id="168.224.5.11">
信息技术据/code>
标签,创建一个完整的句子。据/p>
例如:据/p>
外层据code c-id="168.373.5.1">
描述据/code>
调用声明据code c-id="168.376.5.3">
计算据/code>
服务正在测试中,内部据code c-id="168.379.5.5">
描述据/code>
调用准确地说明正在测试的功能,以及据code c-id="168.382.5.7">
信息技术据/code>
呼叫状态测试用例是什么。运行每个测试用例的完整标签是一个有道理的句子(计算划分懦弱拒绝除以零)。据/p>
页面只是有角度的组件。因此,页面和组件都使用据a href="https://angular.io/guide/testing" c-id="168.394.5.1">
角度的组件测试据/a>
指导方针据/p>
由于页面和组件包含标注代码和HTML模板标记,因此可以执行组件类测试和组件DOM测试。创建页面时,生成的模板测试如下所示:据/p>
进行组件类测试时,使用通过定义的组件对象访问组件对象据code c-id="168.694.5.1">
组件=fixture.componentInstance;据/code>
. 这是component类的一个实例。在进行DOM测试时据code c-id="168.697.5.3">
1.nativeElement据/code>
使用属性。这是实际的据code c-id="168.700.5.5">
HTMLElement据/code>
,它允许测试使用标准的HTML API方法,例如据code c-id="168.703.5.7">
HtmleElement.querySelector据/code>
为了检查DOM。据/p>
服务通常分为两大类:执行计算和其他操作的实用服务,以及主要执行HTTP操作和数据操作的数据服务。据/p>
测试大多数服务的建议方法是实例化该服务,并为该服务具有的任何依赖项手动注入mock。这样,就可以对代码进行隔离测试。据/p>
假设有一个服务具有一个方法,该方法获取一组时间卡并计算净工资。我们还假设税务计算是通过当前服务所依赖的另一个服务处理的。此工资单服务可以这样进行测试:据/p>
这允许测试通过模拟设置来控制各种税收计算返回的值,例如据code c-id="168.916.5.1">
TaxServicespy.FederalIncometax.and.ReturnValue(73.24)据/code>
. 这允许“净工资”测试独立于税收计算逻辑。当税务代码更改时,只需更改与税务服务相关的代码和测试。净工资测试可以继续按原样运行,因为这些测试不关心如何计算税收,只关心正确应用价值。据/p>
通过服务产生时使用的脚手架据code c-id="168.922.5.1">
betway东盟体育app离子G服务名称据/code>
使用Angular的测试实用程序并设置测试模块。这样做并非绝对必要。但是,该代码可以保留在中,从而允许手动构建或注入服务:据/p>
执行HTTP操作的大多数服务将使用角度的HTTPClient服务来执行这些操作。对于这样的测试,建议使用角度据code c-id="168.1274.5.1">
HttpClientTestingModule据/code>
. 有关此模块的详细文档,请参阅Angular's据a href="https://angular.io/guide/http" target="_blank" c-id="168.1277.5.3">
Angular测试HTTP请求据/a>
指南。据/p>
此类测试的此基本设置如下所示:据/p>
管道类似于具有特定定义接口的服务。它是一个包含一个公共方法的类,据code c-id="168.1832.5.1">
使改变据/code>
,它操纵输入值(和其他可选参数),以便创建页面上呈现的输出。要测试管道:实例化管道,调用变换方法,并验证结果。据/p>
作为一个简单的例子,让我们看一个使用据code c-id="168.1838.5.1">
人据/code>
对象并格式化名称。为了简单起见,让我们说一个据code c-id="168.1841.5.3">
人据/code>
包括A.据code c-id="168.1844.5.5">
身份证件据/code>
那据code c-id="168.1847.5.7">
名字据/code>
那据code c-id="168.1850.5.9">
姓据/code>
和据code c-id="168.1853.5.11">
中间初始据/code>
. 管道的要求是将名称打印为“Last,First M”。处理不存在名字、姓氏或中间首字母的情况。这样的测试可能如下所示:据/p>
在使用管道的组件和页面中通过DOM测试来练习管道也是有益的。据/p>
端到端测试用于验证应用程序作为一个整体工作,通常包括与实时数据的连接。单元测试专注于独立的代码单元,因此允许对应用程序逻辑进行低级测试,而端到端测试则专注于各种用户故事或使用场景,提供对整个应用程序数据流的高级测试。单元测试试图发现应用程序逻辑的问题,而端到端测试则试图发现当这些单个单元一起使用时发生的问题。端到端测试揭示了应用程序的整体架构的问题。据/p>
由于端到端测试测试用户故事,并将应用程序作为一个整体而不是单独的代码模块进行覆盖,因此端到端测试除了主应用程序本身的代码外,还存在于项目中自己的应用程序中。大多数端到端测试是通过自动化与应用程序的普通用户交互并检查DOM来确定这些交互的结果来进行的。据/p>
当据code c-id="168.2338.5.1">
@betway东盟体育app离子/角度据/code>
中生成的端到端默认测试应用程序据code c-id="168.2341.5.3">
e2e据/code>
文件夹。此应用程序使用据a href="" c-id="168.2344.5.5">
量角器据/a>
要控制浏览器和据a href="" c-id="168.2347.5.7">
茉莉花据/a>
组织和执行测试。该应用程序最初由四个文件组成:据/p>
端到端测试通过自动化与应用程序的常见用户交互、等待应用程序响应以及检查DOM以确定交互结果来运行。这涉及到大量的DOM操作和检查。如果这些都是手工完成的,测试将非常脆弱,难以阅读和维护。据/p>
页面对象将单个页面的HTML封装在TypeScript类中,提供测试脚本用于与应用程序交互的API。在页面对象中封装DOM操作逻辑使测试更具可读性,更易于推理,从而降低了测试的维护成本。创建精心设计的页面对象是创建高质量和可维护的端到端测试的关键。据/p>
许多测试依赖于一些操作,例如等待页面可见、在输入中输入文本以及单击按钮。用于执行此操作的方法仅与用于更改适当DOM元素的CSS选择器保持一致。因此,将此逻辑抽象为可由其他页面对象使用的基类是有意义的。据/p>
下面的示例实现了所有页面对象都需要支持的一些基本方法。据/p>
jasmine.createspyobj.据/code>
使用创建时定义的一组模拟方法从头创建完整的模拟对象。这很有用,因为它非常简单。不需要在测试中构造或注入任何内容。使用此函数的缺点是,它允许创建可能与真实对象不匹配的对象。据/p>
jasmine.createspy.据/code>
类似,但它创建了一个独立的模拟函数。据/p>
使用据code c-id="168.139.6.1">
spyOn ()据/code>
和据code c-id="168.142.6.3">
SpyonProperty()据/code>
spyOn ()据/code>
在现有对象上安装spy。使用此技术的优点是,如果尝试在对象上不存在的方法上进行spy,则会引发异常。这会防止测试模拟不存在的方法。缺点是测试需要一个完全格式的对象,这可能会增加所需的测试设置量。据/p>
SpyonProperty()据/code>
相似,但不同的是它监视的是属性而不是方法。据/p>
通用测试结构据/a>
描述据/span>
(据/span>
“计算”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
描述据/span>
(据/span>
“分割”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
信息技术据/span>
(据/span>
'正确计算4 / 2 '据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'懦弱地拒绝归零'据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
}据/span>
)据/span>
;据/span>
...据/span>
}据/span>
)据/span>
;据/span>
描述据/span>
(据/span>
“倍增”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
...据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
页面和组件据/a>
进口据/span>
{据/span>
custom_elements_schema.据/span>
}据/span>
从据/span>
'@ Angular / Core'据/span>
;据/span>
进口据/span>
{据/span>
异步的据/span>
那据/span>
部件夹具据span class="token punctuation" c-id="168.436.7.20">
那据/span>
测试用据span class="token punctuation" c-id="168.439.7.22">
}据/span>
从据/span>
'@ Angular /核心/测试'据/span>
;据/span>
进口据/span>
{据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.456.7.33">
}据/span>
从据/span>
“/制表符。第页”据/span>
;据/span>
描述据/span>
(据/span>
'tabspage'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
成分据span class="token operator" c-id="168.490.7.54">
:据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.493.7.56">
;据/span>
允许据/span>
夹具据span class="token operator" c-id="168.499.7.60">
:据/span>
部件夹具据span class="token operator" c-id="168.502.7.62">
据据/span>
塔布斯帕奇据span class="token operator" c-id="168.505.7.64">
>据/span>
;据/span>
摘要据/span>
(据/span>
异步的据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.528.7.78">
。据/span>
配置测试模块据/span>
(据/span>
{据/span>
声明据span class="token operator" c-id="168.537.7.83">
:据/span>
[据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.543.7.87">
]据/span>
那据/span>
模式据span class="token operator" c-id="168.548.7.90">
:据/span>
[据/span>
custom_elements_schema.据/span>
]据/span>
那据/span>
}据/span>
)据/span>
。据/span>
编译组件据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
夹具据span class="token operator" c-id="168.597.7.118">
=据/span>
测试用据span class="token punctuation" c-id="168.600.7.120">
。据/span>
创建组件据/span>
(据/span>
塔布斯帕奇据span class="token punctuation" c-id="168.607.7.124">
)据/span>
;据/span>
成分据span class="token operator" c-id="168.612.7.127">
=据/span>
夹具据span class="token punctuation" c-id="168.615.7.129">
。据/span>
componentInstance据span class="token punctuation" c-id="168.618.7.131">
;据/span>
夹具据span class="token punctuation" c-id="168.621.7.133">
。据/span>
检测变化据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“应该创建”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
成分据span class="token punctuation" c-id="168.664.7.158">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
服务据/a>
基本服务测试据/a>
进口据/span>
{据/span>
PayrollService据span class="token punctuation" c-id="168.738.7.4">
}据/span>
从据/span>
'./payroll.service'据/span>
;据/span>
描述据/span>
(据/span>
“付费服务”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
服务据span class="token operator" c-id="168.772.7.25">
:据/span>
PayrollService据span class="token punctuation" c-id="168.775.7.27">
;据/span>
允许据/span>
TaxServicespy.据span class="token punctuation" c-id="168.781.7.31">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
TaxServicespy.据span class="token operator" c-id="168.799.7.42">
=据/span>
茉莉花据span class="token punctuation" c-id="168.802.7.44">
。据/span>
createSpyObj据/span>
(据/span>
“TaxService”据/span>
那据/span>
{据/span>
联邦林彗星据span class="token operator" c-id="168.816.7.52">
:据/span>
0.据/span>
那据/span>
StateIncometax.据span class="token operator" c-id="168.824.7.57">
:据/span>
0.据/span>
那据/span>
社会安全据span class="token operator" c-id="168.832.7.62">
:据/span>
0.据/span>
那据/span>
医疗保险据span class="token operator" c-id="168.840.7.67">
:据/span>
0.据/span>
}据/span>
)据/span>
;据/span>
服务据span class="token operator" c-id="168.853.7.75">
=据/span>
刚出现的据/span>
PayrollService据/span>
(据/span>
TaxServicespy.据span class="token punctuation" c-id="168.864.7.82">
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
描述据/span>
(据/span>
“净薪酬计算”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
...据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
进口据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.936.7.4">
那据/span>
注射据span class="token punctuation" c-id="168.939.7.6">
}据/span>
从据/span>
'@ Angular /核心/测试'据/span>
;据/span>
进口据/span>
{据/span>
PayrollService据span class="token punctuation" c-id="168.956.7.17">
}据/span>
从据/span>
'./payroll.service'据/span>
;据/span>
进口据/span>
{据/span>
税务局据span class="token punctuation" c-id="168.973.7.28">
}据/span>
从据/span>
”。/ tax.service '据/span>
;据/span>
描述据/span>
(据/span>
“PayrolService”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
TaxServicespy.据span class="token punctuation" c-id="168.1007.7.49">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
TaxServicespy.据span class="token operator" c-id="168.1025.7.60">
=据/span>
茉莉花据span class="token punctuation" c-id="168.1028.7.62">
。据/span>
createSpyObj据/span>
(据/span>
“TaxService”据/span>
那据/span>
{据/span>
联邦林彗星据span class="token operator" c-id="168.1042.7.70">
:据/span>
0.据/span>
那据/span>
StateIncometax.据span class="token operator" c-id="168.1050.7.75">
:据/span>
0.据/span>
那据/span>
社会安全据span class="token operator" c-id="168.1058.7.80">
:据/span>
0.据/span>
那据/span>
医疗保险据span class="token operator" c-id="168.1066.7.85">
:据/span>
0.据/span>
}据/span>
)据/span>
;据/span>
测试用据span class="token punctuation" c-id="168.1079.7.93">
。据/span>
配置测试模块据/span>
(据/span>
{据/span>
提供者据span class="token operator" c-id="168.1088.7.98">
:据/span>
[据/span>
PayrollService据span class="token punctuation" c-id="168.1094.7.102">
那据/span>
{据/span>
提供据span class="token operator" c-id="168.1100.7.106">
:据/span>
税务局据span class="token punctuation" c-id="168.1103.7.108">
那据/span>
使用价值据span class="token operator" c-id="168.1106.7.110">
:据/span>
TaxServicespy.据span class="token punctuation" c-id="168.1109.7.112">
}据/span>
]据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'在注入位置进行测试'据/span>
那据/span>
注射据/span>
(据/span>
[据/span>
PayrollService据span class="token punctuation" c-id="168.1145.7.133">
]据/span>
那据/span>
(据/span>
服务据span class="token operator" c-id="168.1154.8.1">
:据/span>
PayrollService据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
服务据span class="token punctuation" c-id="168.1171.7.147">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'在手动构建的位置进行一些测试'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
常量据/span>
服务据span class="token operator" c-id="168.1217.7.174">
=据/span>
刚出现的据/span>
PayrollService据/span>
(据/span>
TaxServicespy.据span class="token punctuation" c-id="168.1228.7.181">
)据/span>
;据/span>
预计据/span>
(据/span>
服务据span class="token punctuation" c-id="168.1238.7.187">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
测试HTTP数据服务据/a>
进口据/span>
{据/span>
HttpBackend据span class="token punctuation" c-id="168.1294.7.4">
那据/span>
httpclient.据span class="token punctuation" c-id="168.1297.7.6">
}据/span>
从据/span>
“@angular/common/http”据/span>
;据/span>
进口据/span>
{据/span>
HttpTestingController据span class="token punctuation" c-id="168.1314.7.17">
那据/span>
HttpClientTestingModule据span class="token punctuation" c-id="168.1317.7.19">
}据/span>
从据/span>
“@angular /共同/ http /测试”据/span>
;据/span>
进口据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.1334.7.30">
那据/span>
注射据span class="token punctuation" c-id="168.1337.7.32">
}据/span>
从据/span>
'@ Angular /核心/测试'据/span>
;据/span>
进口据/span>
{据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1354.7.43">
}据/span>
从据/span>
“./iss跟踪数据。服务”据/span>
;据/span>
描述据/span>
(据/span>
“IsTrackingDataService”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
httpClient据span class="token operator" c-id="168.1388.7.64">
:据/span>
httpclient.据span class="token punctuation" c-id="168.1391.7.66">
;据/span>
允许据/span>
httpTestingController据span class="token operator" c-id="168.1397.7.70">
:据/span>
HttpTestingController据span class="token punctuation" c-id="168.1400.7.72">
;据/span>
允许据/span>
ISTrackingDataService据span class="token operator" c-id="168.1406.7.76">
:据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1409.7.78">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
测试用据span class="token punctuation" c-id="168.1427.7.89">
。据/span>
配置测试模块据/span>
(据/span>
{据/span>
进口据span class="token operator" c-id="168.1436.7.94">
:据/span>
[据/span>
HttpClientTestingModule据span class="token punctuation" c-id="168.1442.7.98">
]据/span>
那据/span>
提供者据span class="token operator" c-id="168.1447.7.101">
:据/span>
[据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1453.7.105">
]据/span>
}据/span>
)据/span>
;据/span>
httpClient据span class="token operator" c-id="168.1463.7.111">
=据/span>
测试用据span class="token punctuation" c-id="168.1466.7.113">
。据/span>
得到据/span>
(据/span>
httpclient.据span class="token punctuation" c-id="168.1473.7.117">
)据/span>
;据/span>
httpTestingController据span class="token operator" c-id="168.1478.7.120">
=据/span>
测试用据span class="token punctuation" c-id="168.1481.7.122">
。据/span>
得到据/span>
(据/span>
HttpTestingController据span class="token punctuation" c-id="168.1488.7.126">
)据/span>
;据/span>
ISTrackingDataService据span class="token operator" c-id="168.1493.7.129">
=据/span>
刚出现的据/span>
ISTrackingDataService据/span>
(据/span>
httpClient据span class="token punctuation" c-id="168.1504.7.136">
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“存在”据/span>
那据/span>
注射据/span>
(据/span>
[据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1532.7.152">
]据/span>
那据/span>
(据/span>
服务据span class="token operator" c-id="168.1541.8.1">
:据/span>
ISTrackingDataService据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
服务据span class="token punctuation" c-id="168.1558.7.166">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
)据/span>
;据/span>
描述据/span>
(据/span>
“位置”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
信息技术据/span>
(据/span>
'现在获取ISS的位置'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
ISTrackingDataService据span class="token punctuation" c-id="168.1620.7.202">
。据/span>
位置据/span>
(据/span>
)据/span>
。据/span>
订阅据/span>
(据/span>
X据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
X据span class="token punctuation" c-id="168.1648.7.218">
)据/span>
。据/span>
toequal.据/span>
(据/span>
{据/span>
经度据span class="token operator" c-id="168.1659.7.224">
:据/span>
-据/span>
138.1719据/span>
那据/span>
纬度据span class="token operator" c-id="168.1669.7.230">
:据/span>
44.4423据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
常量据/span>
雷据span class="token operator" c-id="168.1692.7.244">
=据/span>
httpTestingController据span class="token punctuation" c-id="168.1695.7.246">
。据/span>
威慑据/span>
(据/span>
'http://api.open-notify.org/iss-now.json'据/span>
)据/span>
;据/span>
预计据/span>
(据/span>
雷据span class="token punctuation" c-id="168.1715.7.258">
。据/span>
要求据span class="token punctuation" c-id="168.1718.7.260">
。据/span>
方法据span class="token punctuation" c-id="168.1721.7.262">
)据/span>
。据/span>
toequal.据/span>
(据/span>
“得到”据/span>
)据/span>
;据/span>
雷据span class="token punctuation" c-id="168.1736.7.270">
。据/span>
冲洗据/span>
(据/span>
{据/span>
iss_位置据span class="token operator" c-id="168.1745.7.275">
:据/span>
{据/span>
经度据span class="token operator" c-id="168.1751.7.279">
:据/span>
'-138.1719'据/span>
那据/span>
纬度据span class="token operator" c-id="168.1759.7.284">
:据/span>
'44.4423'据/span>
}据/span>
那据/span>
时间戳据span class="token operator" c-id="168.1770.7.291">
:据/span>
1525950644.据/span>
那据/span>
信息据span class="token operator" c-id="168.1778.7.296">
:据/span>
“成功”据/span>
}据/span>
)据/span>
;据/span>
httpTestingController据span class="token punctuation" c-id="168.1791.7.304">
。据/span>
验证据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
管据/a>
进口据/span>
{据/span>
NamePipe据span class="token punctuation" c-id="168.1867.7.4">
}据/span>
从据/span>
'./name.pipe'据/span>
;据/span>
进口据/span>
{据/span>
人据span class="token punctuation" c-id="168.1884.7.15">
}据/span>
从据/span>
'../../models/person'据/span>
;据/span>
描述据/span>
(据/span>
“NamePipe”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
允许据/span>
管据span class="token operator" c-id="168.1918.7.36">
:据/span>
NamePipe据span class="token punctuation" c-id="168.1921.7.38">
;据/span>
允许据/span>
testPerson据span class="token operator" c-id="168.1927.7.42">
:据/span>
人据span class="token punctuation" c-id="168.1930.7.44">
;据/span>
摘要据/span>
(据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
管据span class="token operator" c-id="168.1948.7.55">
=据/span>
刚出现的据/span>
NamePipe据/span>
(据/span>
)据/span>
;据/span>
testPerson据span class="token operator" c-id="168.1963.7.64">
=据/span>
{据/span>
身份证件据span class="token operator" c-id="168.1969.7.68">
:据/span>
42据/span>
那据/span>
名字据span class="token operator" c-id="168.1977.7.73">
:据/span>
“道格拉斯。”据/span>
那据/span>
姓据span class="token operator" c-id="168.1985.7.78">
:据/span>
“亚当斯”据/span>
那据/span>
中间初始据span class="token operator" c-id="168.1993.7.83">
:据/span>
'n'据/span>
}据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“存在”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2036.7.109">
)据/span>
。据/span>
托贝特鲁西据/span>
(据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“正确设置全名格式”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2081.7.135">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2088.7.139">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“道格拉斯亚当斯,N。”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'没有中间首字母的手柄'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
删去据/span>
testPerson据span class="token punctuation" c-id="168.2135.7.166">
。据/span>
中间初始据span class="token punctuation" c-id="168.2138.7.168">
;据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2146.7.173">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2153.7.177">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“亚当斯,道格拉斯”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
'处理没有名字'据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
删去据/span>
testPerson据span class="token punctuation" c-id="168.2200.7.204">
。据/span>
名字据span class="token punctuation" c-id="168.2203.7.206">
;据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2211.7.211">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2218.7.215">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“亚当斯N。”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
信息技术据/span>
(据/span>
“没有姓氏的句柄”据/span>
那据/span>
(据/span>
)据/span>
=>据/span>
{据/span>
删去据/span>
testPerson据span class="token punctuation" c-id="168.2265.7.242">
。据/span>
姓据span class="token punctuation" c-id="168.2268.7.244">
;据/span>
预计据/span>
(据/span>
管据span class="token punctuation" c-id="168.2276.7.249">
。据/span>
使改变据/span>
(据/span>
testPerson据span class="token punctuation" c-id="168.2283.7.253">
)据/span>
)据/span>
。据/span>
tobeequal.据/span>
(据/span>
“道格拉斯N.”据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
}据/span>
)据/span>
;据/span>
端到端测试据/a>
测试结构据/a>
progrator.conf.js据/code>
—量角器配置文件据/li>
tsconfig.e2e.json据/code>
- 测试应用程序的特定打字配置据/li>
src/app.po.ts据/code>
-一个页面对象,包含导航应用程序、DOM中的查询元素和页面上的manInput元素的方法据/li>
src/app.e2e-spec.ts据/code>
-测试脚本据/li>
页面对象据/a>
基本页对象据/a>
进口据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2408.7.4">
那据/span>
经过据span class="token punctuation" c-id="168.2411.7.6">
那据/span>
要素据span class="token punctuation" c-id="168.2414.7.8">
那据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2417.7.10">
}据/span>
从据/span>
“量角器”据/span>
;据/span>
出口据/span>
班级据/span>
pageObjectBase.据/span>
{据/span>
私人的据/span>
小路据span class="token operator" c-id="168.2443.7.27">
:据/span>
字符串据/span>
;据/span>
保护据/span>
标签据span class="token operator" c-id="168.2454.7.34">
:据/span>
字符串据/span>
;据/span>
建造师据/span>
(据/span>
标签据span class="token operator" c-id="168.2468.8.1">
:据/span>
字符串据/span>
那据/span>
小路据span class="token operator" c-id="168.2476.8.6">
:据/span>
字符串据/span>
)据/span>
{据/span>
这据/span>
。据/span>
标签据span class="token operator" c-id="168.2492.7.49">
=据/span>
标签据span class="token punctuation" c-id="168.2495.7.51">
;据/span>
这据/span>
。据/span>
小路据span class="token operator" c-id="168.2503.7.56">
=据/span>
小路据span class="token punctuation" c-id="168.2506.7.58">
;据/span>
}据/span>
加载据/span>
(据/span>
)据/span>
{据/span>
回来据/span>
浏览器据span class="token punctuation" c-id="168.2525.7.70">
。据/span>
得到据/span>
(据/span>
这据/span>
。据/span>
小路据span class="token punctuation" c-id="168.2536.7.76">
)据/span>
;据/span>
}据/span>
rootElement据/span>
(据/span>
)据/span>
{据/span>
回来据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2562.7.92">
。据/span>
css据/span>
(据/span>
这据/span>
。据/span>
标签据span class="token punctuation" c-id="168.2573.7.98">
)据/span>
)据/span>
;据/span>
}据/span>
waitunilitinvisible.据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2593.7.110">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2600.7.114">
。据/span>
隐形据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
waitUntilPresent据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2641.7.137">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2648.7.141">
。据/span>
presence据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
waitunilnotpresent.据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2689.7.164">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2696.7.168">
。据/span>
不据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2703.7.172">
。据/span>
presence据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
waitulilvisible.据/span>
(据/span>
)据/span>
{据/span>
浏览器据span class="token punctuation" c-id="168.2747.7.197">
。据/span>
等待据/span>
(据/span>
ExpectedConditions据span class="token punctuation" c-id="168.2754.7.201">
。据/span>
visibilityOf据/span>
(据/span>
这据/span>
。据/span>
rootElement据/span>
(据/span>
)据/span>
)据/span>
那据/span>
3000据/span>
)据/span>
;据/span>
}据/span>
盖蒂特尔据/span>
(据/span>
)据/span>
{据/span>
回来据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2803.7.229">
。据/span>
css据/span>
(据/span>
`据/span>
$ {据/span>
这据/span>
。据/span>
标签据span class="token interpolation-punctuation punctuation" c-id="168.2820.9.4">
}据/span>
离子标题据/span>
`据/span>
)据/span>
)据/span>
。据/span>
getText据/span>
(据/span>
)据/span>
;据/span>
}据/span>
保护据/span>
输入文本据/span>
(据/span>
sel据span class="token operator" c-id="168.2853.8.1">
:据/span>
字符串据/span>
那据/span>
文本据span class="token operator" c-id="168.2861.8.6">
:据/span>
字符串据/span>
)据/span>
{据/span>
常量据/span>
el据span class="token operator" c-id="168.2875.7.254">
=据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2883.7.259">
。据/span>
css据/span>
(据/span>
`据/span>
$ {据/span>
这据/span>
。据/span>
标签据span class="token interpolation-punctuation punctuation" c-id="168.2900.9.4">
}据/span>
$ {据/span>
sel据span class="token interpolation-punctuation punctuation" c-id="168.2907.9.2">
}据/span>
`据/span>
)据/span>
)据/span>
;据/span>
常量据/span>
磷化铟据span class="token operator" c-id="168.2921.7.269">
=据/span>
el据span class="token punctuation" c-id="168.2924.7.271">
。据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.2931.7.275">
。据/span>
css据/span>
(据/span>
'输入'据/span>
)据/span>
)据/span>
;据/span>
磷化铟据span class="token punctuation" c-id="168.2946.7.283">
。据/span>
发送键据/span>
(据/span>
文本据span class="token punctuation" c-id="168.2953.7.287">
)据/span>
;据/span>
}据/span>
保护据/span>
enterTextareaText据/span>
(据/span>
sel据span class="token operator" c-id="168.2970.8.1">
:据/span>
字符串据/span>
那据/span>
文本据span class="token operator" c-id="168.2978.8.6">
:据/span>
字符串据/span>
)据/span>
{据/span>
常量据/span>
el据span class="token operator" c-id="168.2992.7.303">
=据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.3000.7.308">
。据/span>
css据/span>
(据/span>
`据/span>
$ {据/span>
这据/span>
。据/span>
标签据span class="token interpolation-punctuation punctuation" c-id="168.3017.9.4">
}据/span>
$ {据/span>
sel据span class="token interpolation-punctuation punctuation" c-id="168.3024.9.2">
}据/span>
`据/span>
)据/span>
)据/span>
;据/span>
常量据/span>
磷化铟据span class="token operator" c-id="168.3038.7.318">
=据/span>
el据span class="token punctuation" c-id="168.3041.7.320">
。据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.3048.7.324">
。据/span>
css据/span>
(据/span>
“文本区域”据/span>
)据/span>
)据/span>
;据/span>
磷化铟据span class="token punctuation" c-id="168.3063.7.332">
。据/span>
发送键据/span>
(据/span>
文本据span class="token punctuation" c-id="168.3070.7.336">
)据/span>
;据/span>
}据/span>
保护据/span>
点击按钮据/span>
(据/span>
sel据span class="token operator" c-id="168.3087.8.1">
:据/span>
字符串据/span>
)据/span>
{据/span>
常量据/span>
el据span class="token operator" c-id="168.3101.7.352">
=据/span>
要素据/span>
(据/span>
经过据span class="token punctuation" c-id="168.3109.7.357">
。据/span>
css据/span>