php - Laravel - 如何正确模拟/存根模型上的方法
问题描述
如何正确模拟/存根模型上的方法(在 laravel 中)?目前我正在尝试...
$mock = Mockery::spy(Organisation::class);
$mock->shouldReceive('findByCustomerId')->once();
被测代码是
use App\Organisation;
...
public function handle()
{
$org = Organisation::findByCustomerId(1234);
但是,当我运行测试时,我得到一个错误Call to undefined method App\Organisation::findByCustomerId()
,它告诉我类/模型没有被正确地模拟,有谁知道我哪里出错了?
解决方案
当您为它们创建模拟时,Mockery 不会自动重载类(就像其他一些库可能做的那样)。它确实支持重载,但我不知道如何用部分模拟重载一个类。
所以看起来你必须使用依赖注入将模拟对象“注入”到正在测试的类中:
class TestedClass
{
private $organisation;
public function __construct(Organisation $organisation)
{
$this->organisation = $organisation;
}
public function handle()
{
$org = $this->organisation->findByCustomerId(1234);
}
}
Laravel 会自动为您注入正确的对象。要注入模拟对象而不是Organization
类,您可以在测试中执行以下操作:
$mock = \Mockery::spy(Organization::class)->makePartial();
$mock->shouldReceive('findByCustomerId')->once();
$this->app->instance(Organization::class, $mock);
推荐阅读
- python - 设置 R 公式环境和转换上下文管理器
- javascript - 如何使 querySelector 仅在特定包含的文档中查找?
- ubuntu-18.04 - 尽管有这些错误,我如何安装 elm-repl?
- facebook-graph-api - 在 Instagram Graph API 中为业务发现洞察提供指标
- git - 通过跳过项目创建 gitlab 备份
- java - how do I design a loop that accepts user input for a golfer name and their score then displays list?
- assembly - 汇编语言中的PUSH指令是零地址指令还是一地址指令?
- php - 将带有 COALESCE 和 LEFT JOIN 的 SQL 查询转换为 PHP
- python - 循环只删除两个项目?
- amazon-redshift - 基于现有 postgresql 的用于 Redshift 的 Debezium 连接器