1

アプリの統合テストを実行しようとしています。私はそれらの仕事をしています:

  • 開始ジョブ
  • 準備ジョブ
  • 実行ジョブ

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。これを解決する方法は何ですか?

4

1 に答える 1

0

私には、dispatchNow() メソッドがないように思えます。ジョブでは、dispatch() を実行しますが、dispatchNow() が存在しないというエラーが表示されます。

Laravelには、特定のバージョンの前にdispatchNow()メソッドがありませんでした(Laravel 5.2だと思います...よくわかりません)が、dispatch()だけです。expectsJobs がそれについて考えておらず、失敗した可能性があります。

1 つの配列で渡すのではなく、3 つのコマンドを使用することもできます。

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

たぶんそれが役立ちます。

于 2016-09-26T20:40:51.500 に答える