单元测试:如何在流明中模拟具有路由参数的请求
Posted
技术标签:
【中文标题】单元测试:如何在流明中模拟具有路由参数的请求【英文标题】:Unit Test: How to mock Request that has route params in Lumen 【发布时间】:2020-02-19 23:43:00 【问题描述】:我使用 Lumen 创建了一个 API,现在我也将创建测试方法。好的,我知道在 TDD 中它可能是相反的方式。
我的 API 有一个带有注入请求对象的 init(Request $request)
方法。当然,为了测试工作,我必须创建一个模拟请求。我是这样做的:
$req = new Request([], [], ['param' => 'foo']);
看起来不错,但 Request 对象已初始化为空对象。之后我尝试检查路由参数:
dd($req->route('param'));
但它会产生 null;我花了几个小时寻找解决方案并在 Google 上搜索,但没有找到任何解决方案。
有什么想法吗?
【问题讨论】:
【参考方案1】:问题是来自\Illuminate\Http\Request
的第三个参数不是您应该传递路由参数的地方。如果你看一下那个类,你会发现第三个参数是自定义属性(我不知道它到底是什么)。
要模拟请求,您可以使用来自\Illuminate\Http\Request
的方法create
。
例如。路线是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)
....
【讨论】:
感谢 nmfzone。现在我有一个类似的路由:Route::get('/source/path:.*', ['uses' => 'MyController@index']);
有了这个,我可以在“源”中获取第一个 url 段,在“路径”路由参数中获取另一个。这些参数现在是我的 $request 对象中缺少的。
@szatti1489 顺便说一句,我从未见过像/path:.*'
这样的路线。你确定它有效吗?
请用您的实际问题更新您的问题!!我们只是回答您的问题。以上是关于单元测试:如何在流明中模拟具有路由参数的请求的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 测试用例中模拟一个 http 请求并解析路由参数