Laravel 单元测试依赖注入

2022-08-30 17:35:20

我正在尝试为购物车编写测试类。这是我所拥有的:

购物车测试.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无法解析我的购物车类。

这是错误:

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

我的购物车类在许多不同的控制器中得到解决,这很好。

为什么Laravel在我的测试中无法解决它?

我也提到了这篇文章,但仍然没有任何运气。


答案 1

我想通了。下面是更新的类。

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指导我朝着正确的方向前进。您需要使用 setUp 函数,而不是因为实例尚未创建。__constructapp


答案 2

如果你想使用,你必须使用相同的构造函数,并记住调用父方法,如果你不想破坏任何东西__constructPHPUnit\Framework\TestCase

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

        // my init code
    }
}

但是,如果要执行一次初始化代码,或者要在类中包含的每个测试之前执行初始化代码,则正确的方法是使用该方法。有关更多详细信息,请查看 PHPUnit 文档setUpBeforeClass()setUp()


推荐