Laravel 单元测试依赖注入
Laravel Unit Testing Dependency Injection
我正在尝试为购物车编写测试 class。这是我所拥有的:
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 class 在许多不同的控制器中得到很好的解析。
为什么在我的测试中Laravel无法解决?
我也参考了,但仍然没有运气。
我明白了。这是更新后的 class.
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 函数而不是 __construct
,因为尚未创建 app
实例。
如果你想使用__construct
你必须使用与PHPUnit\Framework\TestCase
相同的构造函数并且如果你不想破坏任何东西记得调用父方法
class MyTest extends TestCase
{
public function __construct($name = null, array $data = [], $dataName = '')
{
parent::__construct($name, $data, $dataName);
// my init code
}
}
但是正确的方法是使用方法 setUpBeforeClass()
如果你想执行你的初始化代码一次或者 setUp()
如果你想在你的每个测试之前执行初始化代码 class。
查看 PHPUnit documentation 了解更多详情。
我正在尝试为购物车编写测试 class。这是我所拥有的:
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 class 在许多不同的控制器中得到很好的解析。
为什么在我的测试中Laravel无法解决?
我也参考了
我明白了。这是更新后的 class.
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 函数而不是 __construct
,因为尚未创建 app
实例。
如果你想使用__construct
你必须使用与PHPUnit\Framework\TestCase
相同的构造函数并且如果你不想破坏任何东西记得调用父方法
class MyTest extends TestCase
{
public function __construct($name = null, array $data = [], $dataName = '')
{
parent::__construct($name, $data, $dataName);
// my init code
}
}
但是正确的方法是使用方法 setUpBeforeClass()
如果你想执行你的初始化代码一次或者 setUp()
如果你想在你的每个测试之前执行初始化代码 class。
查看 PHPUnit documentation 了解更多详情。