【发布时间】:2017-09-04 21:20:19
【问题描述】:
这是我第一次使用 Mockery for PHPUnit。我按照这个论坛的例子,仍然得到这个错误:
Mockery\Exception\InvalidCountException:方法 all() 来自 Mockery_0_App_Card 应该被调用 1 次,但调用 0 次。
基本上,我将我的模型注入到我的控制器中。像这样:
class CardController extends Controller
{
protected $repository;
function __construct(Model $repository)
{
$this->repository = $repository;
}
public function index()
{
$data = $this->repository->all();
return $data;
}
}
并尝试像这样进行测试:
class CardTest extends TestCase
{
protected $mock;
protected function setUp(): void
{
parent::setUp();
$this->mock = Mockery::mock('Model', '\App\Card');
}
public function testCardsList()
{
$this->mock->shouldReceive('all')
->once()
->andReturn(json_encode([[
"id"=> 1,
"name"=> "Aut modi quasi corrupti.",
"content"=> "..."
],
[
"id"=> 2,
"name"=> "Voluptas quia distinctio.",
"content"=> "..."
]]));
$this->app->instance('\App\Card', $this->mock);
$response = $this->json('GET', $this->api.'/cards');
$this->assertEquals(200, $response->status(), 'Response code must be 200');
}
}
我尝试了几种变体,但总是一样。例如,在控制器中设置 Mockery 或使用 Card::class 表示法。有什么线索吗?
另外,我确定响应是从数据库中提取数据,而不是使用我提供的数组。所以,嘲弄对我的模型没有影响。
【问题讨论】:
-
您正在调用“索引”函数而不是“全部”。 “all”功能属于模型存储库而不是 App\Card 试试这个。 $this->mock->shouldReceive('index')
-
同理:“来自 Mockery_0_App_Card 的方法 index() 应该被准确地调用 1 次,但被调用 0 次。”。无论如何,据我了解,我应该使用“全部”,因为涉及模型/模拟方法。另一方面,“index”只是控制器方法。
标签: eloquent phpunit laravel-5.4 mockery