Codeception中canSeeRecord()与seeRecord()的区别是什么?
Difference between
seeRecord() and canSeeRecord() in Yii2 Codeception Module 我来给你唠唠这俩方法的核心区别,帮你搞明白为啥你在PhpStorm里没看出差异~
核心行为差异
这俩方法的本质区别在于断言失败后的处理逻辑:
seeRecord()是常规断言:一旦这个断言失败,当前测试方法会立刻终止执行,后续的所有代码都不会跑,你只能看到这一个失败的错误信息。canSeeRecord()是条件断言:正如它PHPDoc里标注的,失败时不会停止测试,会继续执行后续的所有断言,等整个测试方法跑完后,再把所有失败的断言一起汇报给你。
为啥你没看出区别?
你在测试里只写了这一个断言,不管用哪个方法,失败后都只会显示这一个错误,自然看不出差异。要是你写多个断言试试,差异就很明显了:
比如写三个canSeeRecord():
$this->tester->canSeeRecord(MyModel::class, ['name' => 'rob006']); $this->tester->canSeeRecord(MyModel::class, ['name' => 'alice']); $this->tester->canSeeRecord(MyModel::class, ['name' => 'bob']);
如果这三个记录都不存在,用canSeeRecord()的话,测试会跑完所有三个断言,最后告诉你三个都失败了;但如果换成seeRecord(),第一个断言失败就直接停了,你永远不知道后面两个断言的结果。
额外补充
- Codeception里有一堆这类
can*前缀的方法,比如canSee()、canSeeElement(),都是遵循同样的条件断言逻辑——失败不终止,继续执行。 - 官方文档没收录
canSeeRecord(),大概率是因为它是基于Codeception的条件断言机制自动衍生出来的方法,而非Yii2模块特意单独实现的,但它的PHPDoc说明是完全准确的。
什么时候用哪个?
- 如果你这个断言是后续测试的前提(比如必须先确认这个记录存在,才能进行后续操作),用
seeRecord(),失败就及时终止,避免做无用功; - 如果你想一次性批量检查多个记录是否存在,或者希望看到所有断言的结果,用
canSeeRecord(),一次性收集所有错误。
内容的提问来源于stack exchange,提问作者rob006
相关产品推荐
相关产品推荐

