codeigniter4 / CodeIgniter4

Open Source PHP Framework (originally from EllisLab)
https://codeigniter.com/
MIT License
5.35k stars 1.9k forks source link

Bug: Cannot pass value in the function in ControllerTest #2470

Closed charlesng closed 4 years ago

charlesng commented 4 years ago

Direction I have the following Controller Class and would like to write some Controller test using the instruction from documentation (https://codeigniter4.github.io/userguide/testing/controllers.html

Pages.php

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class Pages extends Controller
{

    public function index()
    {
        return view('welcome_message');
    }

    public function showme($page = 'home')
    {
        if (!is_file(APPPATH . '/Views/pages/' . $page . '.php')) {
            // Whoops, we don't have a page for that!            
            throw new \CodeIgniter\Exceptions\PageNotFoundException($page);
        }

        $data['title'] = ucfirst($page); // Capitalize the first letter

        return view('pages/' . $page, $data);
    }
}

PagesTest

<?php

namespace CodeIgniter;

use CodeIgniter\Test\ControllerTester;
use CodeIgniter\Test\CIDatabaseTestCase;

class PagesTest extends CIDatabaseTestCase
{
    use ControllerTester;

    public function testIndex()
    {
        $result = $this->withURI('http://localhost:8080/en')
            ->controller(\App\Controllers\Pages::class)
            ->execute('index');
        $this->assertTrue($result->isOK());
        $this->assertTrue($result->see("Welcome"));
    }

    public function testShowMeWithHome()
    {
        $result = $this->withURI('http://localhost:8080/en/home')
            ->controller(\App\Controllers\Pages::class)
            ->execute('showme');
        $this->assertTrue($result->isOK());
        $this->assertTrue($result->see("I am home page"));
    }

    public function testShowMeWithAbout()
    {
        $result = $this->withURI('http://localhost:8080/en/showme/about')
            ->controller(\App\Controllers\Pages::class)
            ->execute('showme');
        $this->assertTrue($result->isOK());
        $this->assertTrue($result->see("About me"));
    }
}

Describe the bug The 3rd test cases testShowMeWithAbout does not pass about value to the showme function in the controller, which cause it always to pass the default value in the function.

And I have tried to remove the withURI function in the testcase and change it as the following

    public function testShowMeWithAbout()
    {
        $result = $this->controller(\App\Controllers\Pages::class)
            ->execute('showme', 'about');
        $this->assertTrue($result->isOK());
        $this->assertTrue($result->see("About me"));
    }

and now it gave me this error after I run ./vendor/bin/phpunit

1) CodeIgniter\PagesTest::testShowMeWithAbout
TypeError: Argument 2 passed to CodeIgniter\HTTP\IncomingRequest::__construct() must be an instance of CodeIgniter\HTTP\URI or null, string given, called in /Users/{myPath}/vendor/codeigniter4/framework/system/Test/ControllerTester.php on line 134
/Users/{myPath}/vendor/codeigniter4/framework/system/HTTP/IncomingRequest.php:161
/Users/{myPath}/vendor/codeigniter4/framework/system/Test/ControllerTester.php:134
/Users/{myPath}/tests/app/Controllers/PagesTest.php:32

And I would like to know if I did something wrong in the test cases.

CodeIgniter 4 version Codelgniter v4.0.0-rc.3

lonnieezell commented 4 years ago

Because it doesn't go through all of the routing, etc when doing a ControllerTest, you must provide the parameters as you've done in the last example. However, it shouldn't die without a URI, so I'll dig into that.