Работа по тестированию интеграции Laravel

Я пытаюсь запустить интеграционные тесты для своего приложения. У меня есть эти рабочие места:

  • StartJob
  • PrepareJob
  • PeformJob

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. Какой способ решить эту проблему?

1

Решение

Для меня это звучит так, как будто нет dispatchNow () — метода. В Jobs ваш запуск dispatch (), но ошибка говорит, что dispatchNow () не существует.

У Laravel не было метода dispatchNow () до определенной версии (я думаю, что Laravel 5.2 … не уверен), но только dispatch (). Может быть, ожидаемый Джобс не думал об этом и терпит неудачу.

Вы можете попробовать не передавать его в один массив, а использовать 3 команды:

$this->expectsJobs(StartJobs::class);
$this->expectsJobs(PrepareJob::class);
$this->expectsJobs(PerformJob::class);

Может быть, это помогает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]