【问题标题】:Laravel Unit Test ControllerLaravel 单元测试控制器
【发布时间】:2018-03-09 04:42:01
【问题描述】:

如何测试具有 __construct 的函数?

例如,我的控制器代码如下所示:

    namespace App\Http\Controllers; 
    use App\Repositories\UserAccountRepository;
    class UserController extends ProtectedController
    {
      protected $userAccountRepository;
      public function __construct(userAccountRepository 
      $userAccountRepository){
        parent::__construct();
        $this->userAccountRepository = $userAccountRepository;
    }

    public function FunctionWantToTest(){
        return 'string';
    }

在测试我的 FunctionWantToTest 之前首先完成构造所需的单元测试。

所以,我的测试代码看起来像,

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use App\Http\Controllers\UserController;

class UserTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testUserList()
    {

        $UserController = new UserController(???what value??);
        $this->assertTrue(true);
    }
}

需要更多帮助(最佳实践)如何测试具有构造的代码。

【问题讨论】:

  • 我建议对控制器进行功能测试(更多使用控制器的路由),而不是单元测试。
  • 你能给我举个例子吗? @德文

标签: laravel unit-testing phpunit


【解决方案1】:

测试控制器时使用功能测试或集成测试,

您可以看到有关单元测试和集成测试的简要说明。

What's the difference between unit tests and integration tests?

【讨论】:

    【解决方案2】:

    我想你只需要使用app->make:

    class UserTest extends TestCase
    {
    
        protected $userController;
    
        public function setUp() {
    
            parent::setUp();
    
            $this->userController = $this->app->make(UserController::class);
        }
    
        /**
         * A basic test example.
         *
         * @return void
         */
        public function testUserList()
        {
            $this->userController // do what you need here...
            $this->assertTrue(true);
        }
    }
    

    【讨论】:

    • 你能告诉我,1. setUp() 是什么?这是默认的吗? 2. 这是什么? $this->app->make(UserController::class); 3. 我可以在这里做什么? $this->userController // 在这里做你需要的...