我在运行单元测试时收到以下错误。似乎它不喜欢传入Input :: get到构造函数,但是当在浏览器中运行脚本时,操作正常,所以我知道它不是控制器代码。如果我取出任何'task_update'代码,那么即使使用Input,测试也会通过查找传递 - 所以不确定为什么它接受一个方法的输入。
ErrorException: Argument 1 passed to Illuminate\Database\Eloquent\Model::__construct() must be of the type array, null given, called
我的控制器是:
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');
}
}
测试是 - 我正在设置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');
答案 0 :(得分:4)
我相信“调用”功能正在吹走Input :: replace。
所做的工作调用函数实际上可以采用$ parameters参数来解决您的问题。
如果您查看\ Illuminate \ Foundation \ Testing \ TestCase @调用,您将看到该函数:
/**
* 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();
}
如果你这样做:
$response = $this->call('POST', 'tasksUpdates', array('your data here'));
我认为它应该有效。
答案 1 :(得分:1)
我更喜欢同时执行Input::replace($input)
和$this->call('POST', 'path', $input)
。
示例AuthControllerTest.php:
public function testStoreSuccess()
{
$input = array(
'email' => 'email@gmail.com',
'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
}