2016-04-22 9 views
1

Kann mir jemand mit einem Test für die Funktion in der Steuerung helfen. Kann nicht testen, ob eine Anweisung im Controller vorhanden ist. Konzentrieren Sie sich also auf diesen Code. Andere Tests für diesen Controller sind gut, aber nur Code von "if-Anweisung" kann nicht getestet werden.Laravel Test If/Else-Anweisung - 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'); 
    } 
} 

Hier ist mein Test-reqirements für diesen Test:

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

Oder vielleicht sollte ich if-Anweisung vermeiden und setzen es in einer anderen Funktion innerhalb der Steuerung, aber es ist zu kompliziert zu testen, weil ich diesen Controller verspotten sollte?

Antwort

1

Sie können Folgendes tun, was einen Schein erstellt, der die Methode erwartet, die Sprachen initialisiert. Jetzt, da Sie nur die Zählmethode testen möchten, geben Sie einfach ein Array mit einem Element zurück. Dadurch wird der Redirect-Teil Ihres Controllers getestet. Ich habe diesen Code nicht ausgeführt, aber hoffentlich kommst du auf die Idee.

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

Ich habe gerade Ihre Lösung versucht und es funktioniert (nur mit Code 302). Danke, Mann ! – Dulo

+0

Okay. Froh, dass es funktioniert! –