アプリの統合テストを実行しようとしています。私はそれらの仕事をしています:
- 開始ジョブ
- 準備ジョブ
- 実行ジョブ
StartJob は 1 つ以上の PrepareJob をディスパッチし、すべての PrepareJob は 1 つの PerformJob をディスパッチします。
これを追加
$this->expectsJobs(
[
StartJobs::class,
PrepareJob::class,
PerformJob::class
]
);
私のテストはエラーで失敗します
1) JobsTest::testJobs
BadMethodCallException: Method Mockery_0_Illuminate_Contracts_Bus_Dispatcher::dispatchNow() does not exist on this mock object
$this->expectsJobs を削除すると、すべてのテストに合格しますが、DB を特定の状態に変更したかどうかだけで、特定のジョブが実行されたと断言できません。
StartJobs.php
class StartJobs extends Job implements ShouldQueue
{
use InteractsWithQueue;
use DispatchesJobs;
public function handle(Writer $writer)
{
$writer->info("[StartJob] Started");
for($i=0; $i < 5; $i++)
{
$this->dispatch(new PrepareJob());
}
$this->delete();
}
}
準備ジョブ.php
class PrepareJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use DispatchesJobs;
public function handle(Writer $writer)
{
$writer->info("[PrepareJob] Started");
$this->dispatch(new PerformJob());
$this->delete();
}
}
PerformJob.php
class PerformJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
public function handle(Writer $writer)
{
$writer->info("[PerformJob] Started");
$this->delete();
}
}
JobsTest.php
class JobsTest extends TestCase
{
/**
* @var Dispatcher
*/
protected $dispatcher;
protected function setUp()
{
parent::setUp();
$this->dispatcher = $this->app->make(Dispatcher::class);
}
public function testJobs()
{
$this->expectsJobs(
[
StartJobs::class,
PrepareJob::class,
PerformJob::class
]
);
$this->dispatcher->dispatch(new StartJobs());
}
}
$this->expectsJob がディスパッチャーをモックしているのに対し、具体的なディスパッチャーの使用方法に何か関係があると思います。これに関連している可能性があります - https://github.com/laravel/lumen-framework/issues/207。これを解決する方法は何ですか?