2014-02-05 4 views
5

Ich erhalte den folgenden Fehler, wenn ich meine Komponententests durchführe. Scheint, dass es nicht gerne das Input :: get an den Konstruktor übergibt, aber wenn das Skript im Browser ausgeführt wird, funktioniert die Aktion gut, so dass ich weiß, dass es nicht der Controller-Code ist. Wenn ich irgendeinen der 'task_update'-Codes herausnehme, wird der Test nur mit dem Find auch mit dem Input bestanden - also nicht sicher, warum er den Input für eine Methode akzeptiert.Laravel - Eingang läuft nicht durch Einheitentest

ErrorException: Argument 1 passed to Illuminate\Database\Eloquent\Model::__construct() must be of the type array, null given, called 

Mein Controller ist:

public function store() 
{ 
    $task_update = new TaskUpdate(Input::get('tasks_updates')); 

    $task = $this->task->find(Input::get('tasks_updates')['task_id']); 

    $output = $task->taskUpdate()->save($task_update); 

    if (!!$output->id) { 
     return Redirect::route('tasks.show', $output->task_id) 
         ->with('flash_task_update', 'Task has been updated'); 
    } 
} 

und der Test ist - ich den Eingang für task_updates Array bin Einstellung aber ist einfach nicht abgeholt:

Input::replace(['tasks_updates' => array('description' => 'Hello')]); 

    $mockClass = $this->mock; 
    $mockClass->task_id = 1; 

    $this->mock->shouldReceive('save') 
       ->once() 
       ->andReturn($mockClass); 

    $response = $this->call('POST', 'tasksUpdates'); 

    $this->assertRedirectedToRoute('tasks.show', 1); 
    $this->assertSessionHas('flash_task_update'); 

Antwort

4

Ich glaube, Die "Call" -Funktion bläst die Arbeit von Input :: replace weg.

Die Aufruf-Funktion kann tatsächlich einen Parameter $ -Parameter nehmen, der Ihr Problem beheben sollte.

wenn man sich in \ Illuminate \ Foundation \ Testing \ Testcase @ call, müssen Sie die Funktion sehen:

/** 
* Call the given URI and return the Response. 
* 
* @param string $method 
* @param string $uri 
* @param array $parameters 
* @param array $files 
* @param array $server 
* @param string $content 
* @param bool $changeHistory 
* @return \Illuminate\Http\Response 
*/ 
public function call() 
{ 
    call_user_func_array(array($this->client, 'request'), func_get_args()); 

    return $this->client->getResponse(); 
} 

Wenn Sie das tun:

$response = $this->call('POST', 'tasksUpdates', array('your data here')); 

ich denke, es sollte funktionieren.

1

Ich bevorzuge beide Input::replace($input) und $this->call('POST', 'path', $input).

Beispiel AuthControllerTest.php:

public function testStoreSuccess() 
{ 
    $input = array(
     'email' => '[email protected]', 
     'password' => 'password', 
     'remember' => true 
     ); 

    // Input::replace($input) can be used for testing any method which  
    // directly gets the parameters from Input class 
    Input::replace($input); 



    // Here the Auth::attempt gets the parameters from Input class 
    Auth::shouldReceive('attempt') 
    ->with(  
      array(
        'email' => Input::get('email'), 
        'password' => Input::get('password') 
      ), 
      Input::get('remember')) 
    ->once() 
    ->andReturn(true); 

    // guarantee we have passed $input data via call this route 
    $response = $this->call('POST', 'api/v1/login', $input); 
    $content = $response->getContent(); 
    $data = json_decode($response->getContent()); 

    //... assertions 

} 
Verwandte Themen