单元测试:如何在流明中模拟具有路由参数的请求

时间:2019-10-23 16:57:56

标签: laravel api phpunit lumen

我用Lumen创建了一个API,现在我也将创建测试方法。好的,我知道在TDD中可能是相反的方式。

我的API有一个init(Request $request)方法和一个注入的Request对象。为了测试其工作原理,我必须创建一个模拟请求。我是这样的:

$req = new Request([], [], ['param' => 'foo']);

看起来不错,但是Request对象已初始化为空对象。之后,我尝试检查路线参数:

dd($req->route('param'));

但是它产生空值;我花了几个小时找出答案并在Google上搜寻解决方案,但没有找到任何东西。

有什么主意吗?

1 个答案:

答案 0 :(得分:0)

问题在于\Illuminate\Http\Request中的第三个参数不是您应该传递路线参数的地方。如果您看一下该类,您会发现第三个参数是自定义属性(我不知道它到底是什么)。

要模拟请求,可以使用create中的方法\Illuminate\Http\Request

例如路线为Route::post('/users/{user}', 'UsersController@store')

$request = Request::create('/users/1', 'POST', [
    'name' => 'john doe',
]);

dd($request->route('user')); // 1

这是详细信息:

/**
 * Creates a Request based on a given URI and configuration.
 *
 * The information contained in the URI always take precedence
 * over the other information (server and parameters).
 *
 * @param string               $uri        The URI
 * @param string               $method     The HTTP method
 * @param array                $parameters The query (GET) or request (POST) parameters
 * @param array                $cookies    The request cookies ($_COOKIE)
 * @param array                $files      The request files ($_FILES)
 * @param array                $server     The server parameters ($_SERVER)
 * @param string|resource|null $content    The raw body data
 *
 * @return static
 */
public static function create($uri, $method = 'GET', $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
{
    ....
}