Laravel - 输入不通过单元测试

Ash*_*nks 5 php phpunit laravel mockery

我在运行单元测试时收到以下错误.似乎它不喜欢传入Input :: get到构造函数,但是当在浏览器中运行脚本时,操作正常,所以我知道它不是控制器代码.如果我取出任何'task_update'代码,那么即使使用输入,测试也会通过查找传递 - 所以不确定为什么它接受一个方法的输入.

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

我的控制器是:

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

测试是 - 我正在设置task_updates数组的输入但是没有被选中:

    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');
Run Code Online (Sandbox Code Playgroud)

awe*_*wei 4

我相信“call”函数正在摧毁Input::replace 所做的工作。

调用函数实际上可以采用 $parameters 参数,这应该可以解决您的问题。

如果你查看 \Illuminate\Foundation\Testing\TestCase@call,你会看到这个函数:

/**
 * 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();
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

$response = $this->call('POST', 'tasksUpdates', array('your data here'));
Run Code Online (Sandbox Code Playgroud)

我认为应该有效。