Я пытаюсь запустить интеграционные тесты для своего приложения. У меня есть эти рабочие места:
StartJob отправляет один или несколько PrepareJob, каждый PrepareJob отправляет один 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-> expectedJobs делает все мои тесты успешными, но я не могу утверждать, что задание было выполнено, только если оно изменило БД до заданного состояния.
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();
}
}
PrepareJob.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-> expectedJob высмеивает диспетчер. Может быть связано с этим — https://github.com/laravel/lumen-framework/issues/207. Какой способ решить эту проблему?
Для меня это звучит так, как будто нет dispatchNow () — метода. В Jobs ваш запуск dispatch (), но ошибка говорит, что dispatchNow () не существует.
У Laravel не было метода dispatchNow () до определенной версии (я думаю, что Laravel 5.2 … не уверен), но только dispatch (). Может быть, ожидаемый Джобс не думал об этом и терпит неудачу.
Вы можете попробовать не передавать его в один массив, а использовать 3 команды:
$this->expectsJobs(StartJobs::class);
$this->expectsJobs(PrepareJob::class);
$this->expectsJobs(PerformJob::class);
Может быть, это помогает.
Других решений пока нет …