web-dev-qa-db-ja.com

Laravelユニットテストの依存性注入

ショッピングカートのテストクラスを記述しようとしています。これが私が持っているものです:

ShoppingCartTest.php

class ShoppingCartTest extends TestCase {

    use DatabaseTransactions;

    protected $shoppingCart;

    public function __construct() {
        $this->shoppingCart = resolve('App\Classes\Billing\ShoppingCart');
    }

    /** @test */
    public function a_product_can_be_added_to_and_retrieved_from_the_shopping_cart() {

        // just a placeholder at the moment
        $this->assertTrue(true);
    }

}

しかし、phpunitを実行すると、LaravelがShoppingCartClassを解決できないようです。

ここにエラーがあります:

Fatal error: Uncaught exception 'Illuminate\Contracts\Container\BindingResolutionException'
with message 'Unresolvable dependency resolving
[Parameter #0 [ <required> $app ]] in class Illuminate\Support\Manager'
in C:\Development Server\EasyPHP-Devserver-16.1\eds-www\nrponline\vendor\laravel\framework\src\Illuminate\Container\Container.php:850

ShoppingCartクラスをいくつかの異なるコントローラーで問題なく解決しています。

Laravelテスト中に解決できないのはなぜですか?

この投稿 にも言及しましたが、まだ運がありませんでした。

12
Denis Priebe

私はそれを考え出した。これが更新されたクラスです。

class ShoppingCartTest extends TestCase {

    use DatabaseTransactions;

    protected $shoppingCart;

    public function setUp() {

        parent::setUp();

        $this->shoppingCart = $this->app->make('App\Classes\Billing\ShoppingCart');
    }

    /** @test */
    public function a_product_can_be_added_to_and_retrieved_from_the_shopping_cart() {

        // just a placeholder at the moment
        $this->assertTrue(true);
    }

}

@ edcs に感謝します。正しい方向に導いてくれました。 appインスタンスはまだ作成されていないため、__constructではなく、setUp関数を使用する必要があります。

23
Denis Priebe

___construct_を使用する場合は、_PHPUnit\Framework\TestCase_と同じコンストラクタを使用し、何も壊したくない場合は、必ず親メソッドを呼び出す必要があります。

_class MyTest extends TestCase
{
    public function __construct($name = null, array $data = [], $dataName = '')
    {
        parent::__construct($name, $data, $dataName);

        // my init code
    }
}
_

ただし、適切な方法は、initコードを1回実行する場合はsetUpBeforeClass()メソッドを使用するか、クラスに含まれる各テストの前にinitコードを実行する場合はsetUp()を使用することです。詳細は PHPUnitのドキュメント を確認してください。

0
Andrea Mauro