php - incallingMocker::with() 实际上做了什么?

标签 php symfony mocking doctrine phpunit

我正在尝试模拟 Doctrine 存储库,并让模拟的存储库根据输入到 findOneBy() 方法中的内容返回不同的结果。我在设置测试时使用以下代码:

    $this->vacancyRepositoryMock->method('findOneBy')->with(['id' => 5000])->willReturn(null);
    $this->vacancyRepositoryMock->method('findOneBy')->with(['id' => 50])->willReturn($myVacancy);

不幸的是,这导致我得到以下输出:

1) Tests\AppBundle\Service\VacancyServiceTest::testAddName Expectation failed for method name is equal to when invoked zero or more times Parameter 0 for invocation Doctrine\ORM\EntityRepository::findOneBy(Array (...), null) does not match expected value. Failed asserting that two arrays are equal. --- Expected +++ Actual @@ @@ Array ( - 'id' => 50 + 'id' => 5000 )

删除上面两行中的任何一行即可消除该错误。我在这里做错了什么?我是否完全误解了 with() 的作用?

最佳答案

您可以使用withConsecutivewillReturnOnConsecutiveCall将多个with和return放入同一个函数中。我不太确定当你像你一样写它时会发生什么。

你的代码看起来像这样:

$this->vacancyRepositoryMock->method('findOneBy')->expects($this->exactly(2))
    ->withConsecutive([['id' => 5000]],[['id' => 50]]) //array in array is on purpose
    ->willReturnOnConsecutiveCalls(null, $myVacancy);

至于你关于 with 函数到底做什么以及为什么你的方法不起作用的问题......我不确定。

关于php - incallingMocker::with() 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58817472/

相关文章:

symfony - 运行测试后如何删除/缓存 Symfony 内核的目录?

java - 在 spring 中使用 Autowiring Set 时,如何模拟所有实现相同接口(interface)的类?

java - 当使用外部模拟 util 库(也使用 java util lib)测试 java util 库时的循环引用

php - 从 PHP Exception __destruct() 方法发送错误报告是好主意还是坏主意?

php - fatal error : Uncaught Error: Cannot use object of type mysqli_result as array. 如何打印表的属性?

php - 如何根据php mysql中的id更新一行的总和

Symfony2 更新 bootstrap.php.cache

php - 在新服务器上部署 Symfony3 时遇到问题

java - Spock 如何为 Java 类模拟同一个类的方法

php - mysql多对多查询问题