首先,我已经阅读了这个相关问题和另一种方法(博客文章).
这是我的behat.yml:
default:
suites:
users:
contexts:
- DoctrineFixturesContext
- FeatureContext
- Behat\MinkExtension\Context\MinkContext
- Sanpi\Behatch\Context\RestContext
- Sanpi\Behatch\Context\JsonContext
paths: [%paths.base%/features/users]
extensions:
Behat\Symfony2Extension:
kernel:
env: "test"
debug: "true"
Behat\MinkExtension:
base_url: ''
sessions:
default:
symfony2: ~
Sanpi\Behatch\Extension: ~
Run Code Online (Sandbox Code Playgroud)
现在我想要的是重现用户的行为,即:
Authorization带令牌的标头我发现最简单的方法是简单地模仿用户行为:
class FeatureContext implements Context, SnippetAcceptingContext
{
private $request;
public function __construct(Request $request)
{
$this->request = $request;
}
/**
* @BeforeScenario @Login
*/
public function login()
{
$d = $this->request->send('POST', '/login_check', ['_username' => 'test', '_password' => 'test']);
$data = json_decode($d->getContent());
$this->request->setHttpHeader('Authorization', 'Bearer '.$data->token);
}
}
Run Code Online (Sandbox Code Playgroud)
用户之前通过固定装置加载.这种方法很有效,但Authorization标题不会通过后续步骤保留:
Feature: Get my availables menus
@Login
Scenario: Get my menus
When I send a "GET" request to "/api/menus"
Then the response status code should be 200
Run Code Online (Sandbox Code Playgroud)
回复是401.
为什么Authorization标头没有保留在场景中?我怎样才能完成这个简单的任务?
小智 2
正如您可以在此处阅读,在此处阅读,Behatch/RestContext 非常有用(有很多快捷方式和少数方法),但它与 symfony2 集成非常混乱。
正如@stof 在这条评论中所说:
其余上下文完全是一个巨大的错误。Mink 不是 REST 客户端(浏览器也不是 REST 客户端)。使用 Mink 驱动程序执行 REST API 调用是没有意义的。这是不适合这项工作的工具。
长话短说:看来您设置的请求标头没有随请求一起传递。
话虽如此,您可以尝试使用此解决方法:
Feature: Get my availables menus
@Login
Scenario: Get my menus
# note the change in the following line
# When I send a "GET" request to "/api/menus"
When I am on "/api/menus"
Then the response status code should be 200
Run Code Online (Sandbox Code Playgroud)
基本上,使用When I am on...您正在使用 MinkContext 并且请求标头已随请求正确传递。
当然,我知道这不是完美的解决方案(例如:如何处理 POST 请求??),但至少您描述的特定测试应该通过。
让我知道。再见