2016-04-22 2 views
1

Может кто-нибудь помочь мне с тестом на функцию в контроллере. Не могу проверить, есть ли инструкция в контроллере, поэтому, пожалуйста, сосредоточьтесь на этом фрагменте кода. Другие тесты для этого контроллера хороши, но только код из «if statement» не может быть протестирован.Тест Laravel Если/else утверждение - unit test

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'); 
    } 
} 

Вот мои Тестовые reqirements для этого теста:

LanguageControllerTest.php

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\[email protected]', null, $params); 
    } 

Или, может быть, следует избегать, если заявление и поставить он в некоторой другой функции в контроллере, но он слишком сложный проверить, потому что я должен издеваться над этим контроллером?

ответ

1

Вы можете сделать следующее, которое устанавливает макет, который ожидает метод, который инициализирует языки. Теперь, поскольку вы хотите только проверить метод 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\[email protected]', null, $params); 
    $this->assertEquals(301, $response->status()); 
} 
+0

Я просто попробовал ваше решение, и оно работает (только с кодом 302). Спасибо чувак ! – Dulo

+0

Хорошо. Рад, что это работает! –