我将Codeception升级到 v4(根据THIS),然后将Symfony升级到 v5(根据THIS)。现在,当我尝试运行测试时,我收到一个关于缺少测试文件的错误:
root@blabla: 供应商/bin/codecept 运行
在 GroupManager.php 第 129 行:
GroupManager:文件或目录 /var/www/html/tests/unit/SomeFileCest.php 不存在
当前分支中不存在此文件。它存在于项目的另一个分支中,但当前不应该知道有关此文件的任何信息!
无论我切换到哪个分支都会发生这个问题。所以以某种方式Codeception记住,一个分支有额外的测试并要求在其他分支中进行该测试。看起来像某种cache.
如果我切换到缺少文件的分支,一切看起来都不错(我确实收到错误,但由于预期的旧框架)。
如果我这样做vendor/bin/codecept run或vendor/bin/codecept run tests/functional例如(请注意,缺少的测试是单元测试),则会出现错误。
我试图删除/var和/vendor运行composer install/update。我还尝试完全移除分支并从远程拉动,但没有任何乐趣。
任何人都知道为什么会发生这种情况以及如何解决这个问题?
我正在使用Codeception进行一些API测试.我们的想法是确保每个API调用都返回所需格式的预期响应代码和JSON对象.
我遇到的问题是我需要使用不同的URL,具体取决于服务器localhost,测试服务器还是生产服务器.
我无法使用值,$_SERVER['SERVER_NAME']因为测试不是通过Web浏览器运行的.
在http://codeception.com/docs/07-AdvancedUsage#Environments中,他们解释了可以通过修改配置文件来设置某些环境.该文档没有解释如何修改配置文件以在您自己的单元测试中使用它.
我还想设置一些环境,如local,test,production然后,我的单元测试类里面,才知道什么URLs用.每个环境都有不同的URL.
我已经阅读了文档但我无法找到方法.
你知道如何实现我的需求吗?
我正在为前端应用程序构建和编写测试,该应用程序正在调用所有数据的API.我正在使用Codeception进行测试.到目前为止,功能和验收测试工作正常,我希望功能测试独立于API,以便我可以运行它们而不依赖于API服务应用程序.
有没有办法模拟来自API调用的数据?或者这是单元测试的领域?
如何在代码中同时使用两个数据库?我的PHP应用程序使用SQLite数据库,但也连接到另一个使用MySQL数据库的应用程序.
目前我在我的codeception.yml文件中有这个:
modules:
config:
Db:
dsn: 'sqlite:db.sqlite'
dump: tests/_data/dump.sql
populate: true
cleanup: true
Run Code Online (Sandbox Code Playgroud)
这样,数据库每次都会填充测试数据,并在测试结束时自动清理.现在如何添加一个MySQL数据库呢?
此外,如果可能,在某些测试中我使用"seeInDatabase"函数.我如何指定它必须看哪个数据库?
我正在使用我的测试在estore中创建产品,并且需要在提交表单后获取URL.
提交按钮后,是否可以在测试范围内获取URL ?
$I->click('#formSubmit');
$I->wait(5); // wait for redirect to new url
$url = $I->someFunctionToGetCurrentUrl()`
Run Code Online (Sandbox Code Playgroud)
我从控制台运行此测试,而不是从Web浏览器运行,因此我无法访问服务器端的$ _SERVER.
但是,如果我有一些像$I->canSeeCurrentUrlEquals()代码框架中的方法,那么我应该能够以某种方式访问当前的URL ...
怎么做?
我正在使用Codeception\Util\Stub来创建单元测试.我想确保我的方法多次调用.为此,我正在使用'确切'的方法.
例:
use \UnitTester;
use \Codeception\Util\Stub as StubUtil;
class someCest
{
public function testMyTest(UnitTester $I)
{
$stub = StubUtil::makeEmpty('myClass', [
'myMethod' => StubUtil::exactly(2, function () { return 'returnValue'; })
]);
$stub->myMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
如你所见,我给myMethod打过一次电话.但测试通过了.与method :: once相同的问题,因为此方法使用相同的类PHPUnit_Framework_MockObject_Matcher_InvokedCount(下面的'matcher').只有当我打电话超过预期时间(> 2)时,测试才会失败.因为matcher的方法'invoked'检查计数是否超出预期.但是看不出是否有人调用matcher的方法'verify'来检查myMethod是否调用的次数少于预期.
抱歉stackoverflow,这是我的第一个问题.
UPDATE
我的快速和BAD临时解决方案:
将存根添加到帮助器中
$I->addStubToVerify($stub);
Run Code Online (Sandbox Code Playgroud)
将方法添加到帮助程序以验证:
protected $stubsToVerify = [];
public function verifyStubs()
{
foreach ($this->stubsToVerify as $stub) {
$stub->__phpunit_getInvocationMocker()->verify();
}
return $this;
}
Run Code Online (Sandbox Code Playgroud)
在Cest的方法_after()中调用此方法:
public function _after(UnitTester $I)
{
$I->verifyStubs();
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在Yii2/Codeception ActiveFixture中的夹具数据文件中指定另一个夹具的相关行?考虑这个用户/配置文件关系的示例:
user.php的:
return [
'user1' => [
'email' => 'user1@example.net',
]
];
Run Code Online (Sandbox Code Playgroud)
profile.php:
use common\models\User;
return [
'profile1' => [
'user_id' => User::findOne(['email' => 'user1@example.net'])->id;
'name' => 'My Name',
]
];
Run Code Online (Sandbox Code Playgroud)
该文档指出"您可以为行添加别名,以便在测试后期,您可以通过别名引用该行." 有没有办法在另一个灯具内引用行?例如,在profile.php中使用类似$ this-> user('user1') - > id的内容?关于如何做到,我找不到任何提及.你如何创造这种相关的装置?
在现代编程工作流程中,一次使用了许多测试框架.例如,在PHP世界中,它实际上是一次使用单元测试,集成测试和功能/验收测试的标准方法.大多数情况下,不同的框架用于不同的测试类型.我使用PHPSpec组合单元,PHPunit用于集成,CodeCeption用于功能测试.
是否有可能聚合每个框架返回的代码覆盖率结果?是否有任何工具可以聚合来自不同框架的代码覆盖率报告? 或者,只有在每个框架不正确时才能查看每个框架的单个结果,因为每个代码覆盖率报告都没有考虑其他测试.
我正在使用Codeception库为我的Laravel应用程序编写测试.我正在使用Laravel5模块,并配置了cleanup这意味着所有测试都将在数据库事务中运行,这样我的测试数据库就不会充满测试数据.
我正在测试的其中一个端点通过表单请求设置了以下验证规则:
public function rules()
{
return ['user_id' => 'required|exists:users,id'];
}
Run Code Online (Sandbox Code Playgroud)
我写入POST到此端点的测试如下:
public function store(ApiTester $I)
{
// Create a couple of users
$users = factory(\App\Models\User::class, 2)->create();
$I->wantTo('ask someone to be my friend');
$I->authenticateAs($users[0]);
$I->sendPOST('users/' . $users[0]->id . '/friendships', [
'user_id' => $users[1]->id
]);
$I->seeResponseCodeIs(201);
}
Run Code Online (Sandbox Code Playgroud)
此测试总是失败.在调查之后,我可以看到它失败了,因为该请求由于exists:users,id规则而未通过验证.如果我将Codeception设置更改为不在事务中执行测试,Laravel的验证器可以成功地看到我在测试开始时创建的两个用户的存在并且测试通过.
所以,我的问题是,有什么办法可以维护我在数据库事务中包装每个测试的行为,并让Laravel的验证器能够看到我在测试中创建的记录吗?
我想在特定Cest中的所有测试之前运行一些东西,然后在所有测试运行后清理它,类似于PHPUnit中的setUpBeforeClass和tearDownAfterClass方法.
有没有一种方法可以在Codeception中做这样的事情?