Codeception在https://codeception.com/docs/05-UnitTests
上有功能测试文档。因此,在我的laravel / homestead项目中,请按照以下步骤操作:
在functional.sute.yml中:
class_name: FunctionalTester
modules:
enabled:
- Laravel5
- \Helper\Functional
我的测试:
<?php
class LoginCest
{
public function _before(FunctionalTester $I)
{
}
public function _after(FunctionalTester $I)
{
}
// tests
public function tryLogin (FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('email', 'someemail');
$I->fillField('password', 'somepw');
$I->click('Login');
$
I->see('some text');
}
}
因此,当我运行测试时,它会失败:
There was 1 error:
---------
1) LoginCest: Try login
Test tests/functional/LoginCest.php:tryLogin
[ExternalUrlException] Codeception\Module\Laravel5 can't open external URL: http://myapp.test/login
Scenario Steps:
4. $I->click("Login") at tests/functional/LoginCest.php:20
3. $I->fillField("password","somepw") at tests/functional/LoginCest.php:19
2. $I->fillField("email","someemail") at tests/functional/LoginCest.php:18
1. $I->amOnPage("/login") at tests/functional/LoginCest.php:17
#1 Codeception\Lib\InnerBrowser->click
#2 /home/vagrant/Code/my-app/tests/_support/_generated/FunctionalTesterActions.php:1114
#3 /home/vagrant/Code/my-app/tests/functional/LoginCest.php:20
#4 LoginCest->tryLogin
ERRORS!
Tests: 1, Assertions: 0, Errors: 1.
我的应用网址是在宅基地上运行的someapp.test。
在查看我的LoginController时,我看到:
$this->redirectTo();
在最后。
现在,我了解功能测试不需要网络服务器,并且我可以使用验收测试使其正常工作。但实际上很难理解为什么即使您甚至不能指定URL也会有人使用代码接收进行功能测试。当其他人可能遇到类似问题时,为什么代码接收会使用登录示例进行功能测试?
答案 0 :(得分:2)
首先是一些背景。
URL包含以下主要部分:PROTOCOL:// DOMAIN:PORT / URI?QUERY_STRING#HASH HASH仅在客户端使用,而不传递给Web服务器,因此不能用于路由。 PROTOCOL和PORT可以用于路由,但这是非常不寻常的。 某些网站根据用于访问它们的DOMAIN显示不同的内容, 但大多数只使用URI和/或QUERY_STRING部分来路由和显示正确的页面。
使用Codeception进行功能测试的主要区别在于,它不需要网络服务器,因此大多数情况下都不关心域名。
网站代码通常并不在乎是否使用http://myapp.test/或http://google.com/来访问,并且很高兴返回其中任何一个的首页。 尽管如果单击http://google.com/链接显示了首页,则几乎可以肯定是错误的。 为了防止这种情况,几年前就实施了外部域检查。
您网站中的所有内部链接都必须没有域组件,或者必须与使用Host标头传递的内容相匹配。 对于domain based routing使用的域是例外情况,此类域可用于测试。