标签: codeception

Codeception4:GroupManager 报告缺少测试文件

我将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 runvendor/bin/codecept run tests/functional例如(请注意,缺少的测试是单元测试),则会出现错误。

我试图删除/var/vendor运行composer install/update。我还尝试完全移除分支并从远程拉动,但没有任何乐趣。

任何人都知道为什么会发生这种情况以及如何解决这个问题?

php symfony codeception symfony5

12
推荐指数
1
解决办法
2288
查看次数

使用不同的代码环境

我正在使用Codeception进行一些API测试.我们的想法是确保每个API调用都返回所需格式的预期响应代码和JSON对象.

我遇到的问题是我需要使用不同的URL,具体取决于服务器localhost,测试服务器还是生产服务器.

我无法使用值,$_SERVER['SERVER_NAME']因为测试不是通过Web浏览器运行的.

http://codeception.com/docs/07-AdvancedUsage#Environments中,他们解释了可以通过修改配置文件来设置某些环境.该文档没有解释如何修改配置文件以在您自己的单元测试中使用它.

我还想设置一些环境,如local,test,production然后,我的单元测试类里面,才知道什么URLs用.每个环境都有不同的URL.

我已经阅读了文档但我无法找到方法.

你知道如何实现我的需求吗?

php unit-testing codeception

11
推荐指数
1
解决办法
3482
查看次数

codeception - 模拟api调用数据

我正在为前端应用程序构建和编写测试,该应用程序正在调用所有数据的API.我正在使用Codeception进行测试.到目前为止,功能和验收测试工作正常,我希望功能测试独立于API,以便我可以运行它们而不依赖于API服务应用程序.

有没有办法模拟来自API调用的数据?或者这是单元测试的领域?

laravel-4 codeception

11
推荐指数
1
解决办法
1192
查看次数

在代码中同时使用两个数据库

如何在代码中同时使用两个数据库?我的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"函数.我如何指定它必须看哪个数据库?

php codeception

11
推荐指数
1
解决办法
1054
查看次数

如何从codeception和phantomjs测试中获取当前url?

我正在使用我的测试在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 ...

怎么做?

php phantomjs codeception

11
推荐指数
2
解决办法
4805
查看次数

Codeception\Util\Stub方法:: exact和:: once不起作用

我正在使用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)

php unit-testing stub codeception

10
推荐指数
1
解决办法
1664
查看次数

引用yii2/codeception数据文件中的fixture记录

有没有办法在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 fixtures yii2 codeception

10
推荐指数
1
解决办法
1587
查看次数

汇总来自不同测试框架的代码覆盖率

在现代编程工作流程中,一次使用了许多测试框架.例如,在PHP世界中,它实际上是一次使用单元测试,集成测试和功能/验收测试的标准方法.大多数情况下,不同的框架用于不同的测试类型.我使用PHPSpec组合单元,PHPunit用于集成,CodeCeption用于功能测试.

是否有可能聚合每个框架返回的代码覆盖率结果?是否有任何工具可以聚合来自不同框架的代码覆盖率报告? 或者,只有在每个框架不正确时才能查看每个框架的单个结果,因为每个代码覆盖率报告都没有考虑其他测试.

testing phpunit code-coverage phpspec codeception

10
推荐指数
1
解决办法
952
查看次数

通过Codeception测试具有存在规则的Laravel 5路由

我正在使用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的验证器能够看到我在测试中创建的记录吗?

php transactions laravel codeception laravel-5

10
推荐指数
1
解决办法
532
查看次数

Codeception在CEST内的所有测试之前运行

我想在特定Cest中的所有测试之前运行一些东西,然后在所有测试运行后清理它,类似于PHPUnit中的setUpBeforeClass和tearDownAfterClass方法.

有没有一种方法可以在Codeception中做这样的事情?

php codeception

10
推荐指数
2
解决办法
4415
查看次数