Php Laravel测试If/else语句-单元测试

Php Laravel测试If/else语句-单元测试,php,unit-testing,if-statement,laravel-5,mockery,Php,Unit Testing,If Statement,Laravel 5,Mockery,有人能帮我测试一下控制器的功能吗。无法测试控制器中的if语句,因此请关注这段代码。 此控制器的其他测试是良好的,但只能测试“if语句”中的代码 LanguageController.php class LanguageController extends Controller implements IEntityViewManager { protected $languageRepo; public function __construct(LanguageRepositor

有人能帮我测试一下控制器的功能吗。无法测试控制器中的if语句,因此请关注这段代码。 此控制器的其他测试是良好的,但只能测试“if语句”中的代码

LanguageController.php

class LanguageController extends Controller implements IEntityViewManager
{
    protected $languageRepo;

    public function __construct(LanguageRepositoryInterface $languageRepo)
    {
        $this->languageRepo = $languageRepo;
    }

    public function createAction(LanguagePostRequest $request)
    {
        $languages = $this->languageRepo->whereCharOrName($request->char, $request->name);

        if(count($languages) > 0)
        {
            return redirect()->back()->withErrors("Already exists")->withInput();
        }

        $language = new Language();
        $this->languageRepo->store($language, $request->all());

        return redirect()->route('Admin.Language.showAllView');
    }
}
class LanguageControllerTest extends TestCase
{
    public function __construct($name = NULL, array $data = array(), $dataName = '')
    {
        parent::__construct($name, $data, $dataName);
    }

    public function setUp()
    {
        parent::setUp();
    }

    public function tearDown()
    {
        Mockery::close();
    }

    protected function setUpMock()
    {
        $mock = Mockery::mock(LanguageRepositoryInterface::class);
        $this->app->instance(LanguageRepositoryInterface::class, $mock);

        return $mock;
    }

    public function testInvalidInsertLanguage1()
    {
        $params = array(
            'char' => 'en',
            'name' => 'English'
        );

        $mock = $this->setUpMock();

        // HELP ME TO TEST IF STATEMENT AND TO REDIRECT BACK WITH ERRORS AND INPUTS
        // NEED CONTENT

        $this->action('POST', 'Entities\LanguageController@createAction', null, $params);
    }
以下是我的测试要求:

LanguageControllerTest.php

class LanguageController extends Controller implements IEntityViewManager
{
    protected $languageRepo;

    public function __construct(LanguageRepositoryInterface $languageRepo)
    {
        $this->languageRepo = $languageRepo;
    }

    public function createAction(LanguagePostRequest $request)
    {
        $languages = $this->languageRepo->whereCharOrName($request->char, $request->name);

        if(count($languages) > 0)
        {
            return redirect()->back()->withErrors("Already exists")->withInput();
        }

        $language = new Language();
        $this->languageRepo->store($language, $request->all());

        return redirect()->route('Admin.Language.showAllView');
    }
}
class LanguageControllerTest extends TestCase
{
    public function __construct($name = NULL, array $data = array(), $dataName = '')
    {
        parent::__construct($name, $data, $dataName);
    }

    public function setUp()
    {
        parent::setUp();
    }

    public function tearDown()
    {
        Mockery::close();
    }

    protected function setUpMock()
    {
        $mock = Mockery::mock(LanguageRepositoryInterface::class);
        $this->app->instance(LanguageRepositoryInterface::class, $mock);

        return $mock;
    }

    public function testInvalidInsertLanguage1()
    {
        $params = array(
            'char' => 'en',
            'name' => 'English'
        );

        $mock = $this->setUpMock();

        // HELP ME TO TEST IF STATEMENT AND TO REDIRECT BACK WITH ERRORS AND INPUTS
        // NEED CONTENT

        $this->action('POST', 'Entities\LanguageController@createAction', null, $params);
    }

或者我应该避免使用if语句,并将其放在控制器内的其他函数中,但它太复杂,无法测试,因为我应该模拟此控制器?

您可以执行以下操作,设置一个模拟,该模拟需要初始化语言的方法。现在,因为您只想测试count方法,所以只需返回一个包含元素的数组。这将测试控制器的重定向部分。我还没有运行这段代码,但希望你能理解

public function setUp()
{
    $this->mock = Mockery::mock("LanguageRepositoryInterface");
}

public function testInvalidInsertLanguageRedirect()
{
    $params = array(
        'char' => 'en',
        'name' => 'English'
    );

    $this->mock
         ->shouldReceive("whereCharOrName")
         ->once()
         ->andReturn([1]);

    $response = $this->action('POST', 'Entities\LanguageController@createAction', null, $params);
    $this->assertEquals(301, $response->status());   
}

我刚刚尝试了您的解决方案,它可以正常工作(仅适用于代码302)。谢谢你,伙计!