如何有效地测试使用 Behat/Mink 访问大文件?
Posted
技术标签:
【中文标题】如何有效地测试使用 Behat/Mink 访问大文件?【英文标题】:How to efficiently test accessing a large file with Behat/Mink? 【发布时间】:2013-11-12 16:00:00 【问题描述】:我想编写 Behat/Mink 场景来检查某些用户帐户是否可以下载大文件。我可以使用When I follow "largefile.zip"
事件,但这似乎会下载整个文件。
与其浪费时间和资源流式传输大文件,我想(例如)检查 HTTP HEAD
请求的结果,或者尝试使用 HTTP GET
请求开始下载文件然后立即取消并查看the response status code
。
如何使用 Behat/Mink 做到这一点?
【问题讨论】:
您找到解决方案了吗?我也有同样的问题。 @BaptisteDonaux:不,还没有。 目前我正在尝试测试一个小文件的下载。想我可以做'当我关注“somefile.txt”''那么响应应该包含“sometext”',但大概是因为文件是下载而不是打开的,我只是得到'在任何地方都找不到字符串“sometext”在当前页面的 html 响应中。你知道如何处理这方面的问题吗? @NathanStretch:我也还没弄清楚。我刚刚检查了 HTTP 响应代码。 在阅读和查看代码之后,听起来好像没有预先构建的方法可以做到这一点。您可以扩展 BehatContext 类并添加一个自定义函数,该函数使用 cURL 来获取文件的一部分。 【参考方案1】:我同意@NathanStretch 关于扩展的看法,所以这就是我所做的。
此示例基于使用http://download.thinkbroadband.com/5MB.zip 作为下载网址。不完美,因为我没有在响应标头中看到文件名,但它确实有内容长度。
<?php
class DownloadContext extends Behat\MinkExtension\Context\RawMinkContext
private $headers = [];
/**
* @When /^I try to download "([^"]*)"$/
*/
public function iTryToDownload($url)
$this->headers = get_headers($url);
/**
* @Then /^I should see in the header "([^"]*)"$/
*/
public function iShouldSeeInTheHeader($header)
assert(in_array($header, $this->headers), "Did not see \"$header\" in the headers.");
使用具有以下内容的 .feature 文件:
Scenario: Try to download a file
When I try to download "http://download.thinkbroadband.com/5MB.zip"
Then I should see in the header "Content-Length: 5242880"
如果您可以自己控制下载,则可以在标题中设置文件名并检查它而不是大小。如果大小可以变化当然更好,因为我认为这意味着必须拆分内容长度字符串,转换为 int 并 然后 进行比较。啊。可能有一个更优雅的解决方案。
希望能有所帮助。
【讨论】:
以上是关于如何有效地测试使用 Behat/Mink 访问大文件?的主要内容,如果未能解决你的问题,请参考以下文章