Laminas 单元测试控制器动作 POST 参数不起作用
Laminas Unit-test controller-action POST parameter does not work
我有一个控制器extends AbstractHttpControllerTestCase
。
我尝试将参数 (some_uuid) 传递给 dispatch() 函数(在我的 testFoo 函数中):
$this->dispatch('/my-special-url', 'POST', ['some_uuid' => '16294469-f531-40d6-89e9-3ab677a47c45']);
$this->assertResponseStatusCode(200);
为什么控制器里没有这个参数?
[编辑]
代码不多。但是,如果有人想看到所有内容:
class ProductStockAjaxControllerTest extends AbstractHttpControllerTestCase
{
protected function setUp(): void
{
$configOverrides = [];
$this->setApplicationConfig(ArrayUtils::merge(
include __DIR__ . '/../../../../../../config/application.config.php',
$configOverrides
));
parent::setUp();
/** @var UserService $userService */
$userService = $this->getApplication()->getServiceManager()->get(UserService::class);
$userService->setSessionHashManually('151956ad612953e61533b9d2d5844d65df5b5c8c4e35f5e49375ef77711b6676');
}
public function testIndexActionCanBeAccessed()
{
$this->dispatch('/my-special-url', 'POST'
, ['some_uuid' => '16294469-f531-40d6-89e9-3ab677a47c45', 'ano_uuid' => '0a6cea79-9869-4da4-b8db-02bd21d1488a']);
//$this->assertResponseStatusCode(200);
$this->assertModuleName('lerp');
$this->assertControllerName(ProductStockAjaxController::class);
$this->assertControllerClass('ProductStockAjaxController');
$this->assertMatchedRouteName('my_special_url');
}
}
问题出在我要测试的控制器上。我在那里使用 filter_input()
来获取 POST 值!
如果我使用 $this->getRequest()->getPost('some_uuid')
获取 POST 值,它工作正常并且我的单元测试显示正常。
这可能是因为如果您的控制器中有类似以下内容:
$some_uuid = $this->params()->fromRoute('some_uuid', 0);
它不会工作,因为它需要路由中的参数,这是 GET 参数,而不是 POST 参数。在那种情况下,测试本身可能如下所示:
$this->dispatch('/my-special-url/16294469-f531-40d6-89e9-3ab677a47c45');
bitkorn 的回答通过默认等待 POST 参数来解决这个问题。
我有一个控制器extends AbstractHttpControllerTestCase
。
我尝试将参数 (some_uuid) 传递给 dispatch() 函数(在我的 testFoo 函数中):
$this->dispatch('/my-special-url', 'POST', ['some_uuid' => '16294469-f531-40d6-89e9-3ab677a47c45']);
$this->assertResponseStatusCode(200);
为什么控制器里没有这个参数?
[编辑] 代码不多。但是,如果有人想看到所有内容:
class ProductStockAjaxControllerTest extends AbstractHttpControllerTestCase
{
protected function setUp(): void
{
$configOverrides = [];
$this->setApplicationConfig(ArrayUtils::merge(
include __DIR__ . '/../../../../../../config/application.config.php',
$configOverrides
));
parent::setUp();
/** @var UserService $userService */
$userService = $this->getApplication()->getServiceManager()->get(UserService::class);
$userService->setSessionHashManually('151956ad612953e61533b9d2d5844d65df5b5c8c4e35f5e49375ef77711b6676');
}
public function testIndexActionCanBeAccessed()
{
$this->dispatch('/my-special-url', 'POST'
, ['some_uuid' => '16294469-f531-40d6-89e9-3ab677a47c45', 'ano_uuid' => '0a6cea79-9869-4da4-b8db-02bd21d1488a']);
//$this->assertResponseStatusCode(200);
$this->assertModuleName('lerp');
$this->assertControllerName(ProductStockAjaxController::class);
$this->assertControllerClass('ProductStockAjaxController');
$this->assertMatchedRouteName('my_special_url');
}
}
问题出在我要测试的控制器上。我在那里使用 filter_input()
来获取 POST 值!
如果我使用 $this->getRequest()->getPost('some_uuid')
获取 POST 值,它工作正常并且我的单元测试显示正常。
这可能是因为如果您的控制器中有类似以下内容:
$some_uuid = $this->params()->fromRoute('some_uuid', 0);
它不会工作,因为它需要路由中的参数,这是 GET 参数,而不是 POST 参数。在那种情况下,测试本身可能如下所示:
$this->dispatch('/my-special-url/16294469-f531-40d6-89e9-3ab677a47c45');
bitkorn 的回答通过默认等待 POST 参数来解决这个问题。