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

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:.*' 这样的路线。你确定它有效吗? 请用您的实际问题更新您的问题!!我们只是回答您的问题。

以上是关于单元测试:如何在流明中模拟具有路由参数的请求的主要内容,如果未能解决你的问题,请参考以下文章

单元测试基本框架和8个测试方面

在 Laravel 测试用例中模拟一个 http 请求并解析路由参数

在 Grails 中对服务进行单元测试时如何模拟请求

如何在单元测试SpringBoot中解析JWT令牌

如何在 Grails 单元测试中使用 Spock 模拟 passwordEncoder

使用无脂肪框架进行单元测试