Aspect mock 不会在 codeception 中重载方法
Aspect mock does not overload method in codeception
我有这样的文件:
/src/Api.php
<?php
namespace src;
class Api {
function apiCall()
{
return 'api_result';
}
}
/tests/_bootstrap.php
<?php
include __DIR__.'/../vendor/autoload.php'; // composer autoload
$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
'debug' => true,
'includePaths' => [__DIR__.'/../src'],
'cacheDir' => __DIR__ . '/aspectCache'
]);
codeception.yml
paths:
tests: tests
output: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
actor_suffix: Tester
extensions:
enabled:
- Codeception\Extension\RunFailed
settings:
bootstrap: _bootstrap.php
composer.json
{
"require-dev": {
"codeception/aspect-mock": "*",
"codeception/codeception": "^2.3"
},
"autoload": {
"psr-4": {
"": "src/"
}
}
}
index.php
<?php
require_once "vendor/autoload.php";
use src\Api;
$api = new Api();
echo $api->apiCall();
echo 'test';
/tests/acceptance/FirstCest.php
<?php
use AspectMock\Test as test;
use src\Api;
class FirstCest
{
public function frontpageWorks(AcceptanceTester $I)
{
$I->amOnPage('/');
test::double(Api::class, ['apiCall' => 'mock']);
$I->see('mocktest');
}
}
当我在浏览器中加载页面时,我看到字符串 'api_resulttest'
现在当我模拟 apiCall 函数时,输出应该是 'mocktest'。
我运行命令
php codecept.phar run --steps -d
并且测试失败,我仍然看到输出 'api_resulttest'。
为什么?我是否正确使用它? https://github.com/Codeception/AspectMock这里没有展示如何在代码测试中使用它。
或者请用另一种方式告诉我——我应该如何在 codeception 中模拟 api 调用?这就是我想做的。
我已经推入了 bitbucket,所以你可以测试这个例子:
https://bitbucket.org/darius_v/codeception_mock/src
更新2017年10月01日
现在在我最新的提交中删除了方面模拟。
PhpBrowser 通过 HTTP 向您的网站发出请求,因此测试代码中设置的模拟对应用代码没有影响。
如果您使用的是框架模块,则模拟在单元测试和功能测试中有效。
我有这样的文件:
/src/Api.php
<?php
namespace src;
class Api {
function apiCall()
{
return 'api_result';
}
}
/tests/_bootstrap.php
<?php
include __DIR__.'/../vendor/autoload.php'; // composer autoload
$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
'debug' => true,
'includePaths' => [__DIR__.'/../src'],
'cacheDir' => __DIR__ . '/aspectCache'
]);
codeception.yml
paths:
tests: tests
output: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
actor_suffix: Tester
extensions:
enabled:
- Codeception\Extension\RunFailed
settings:
bootstrap: _bootstrap.php
composer.json
{
"require-dev": {
"codeception/aspect-mock": "*",
"codeception/codeception": "^2.3"
},
"autoload": {
"psr-4": {
"": "src/"
}
}
}
index.php
<?php
require_once "vendor/autoload.php";
use src\Api;
$api = new Api();
echo $api->apiCall();
echo 'test';
/tests/acceptance/FirstCest.php
<?php
use AspectMock\Test as test;
use src\Api;
class FirstCest
{
public function frontpageWorks(AcceptanceTester $I)
{
$I->amOnPage('/');
test::double(Api::class, ['apiCall' => 'mock']);
$I->see('mocktest');
}
}
当我在浏览器中加载页面时,我看到字符串 'api_resulttest'
现在当我模拟 apiCall 函数时,输出应该是 'mocktest'。
我运行命令
php codecept.phar run --steps -d
并且测试失败,我仍然看到输出 'api_resulttest'。
为什么?我是否正确使用它? https://github.com/Codeception/AspectMock这里没有展示如何在代码测试中使用它。
或者请用另一种方式告诉我——我应该如何在 codeception 中模拟 api 调用?这就是我想做的。
我已经推入了 bitbucket,所以你可以测试这个例子: https://bitbucket.org/darius_v/codeception_mock/src
更新2017年10月01日 现在在我最新的提交中删除了方面模拟。
PhpBrowser 通过 HTTP 向您的网站发出请求,因此测试代码中设置的模拟对应用代码没有影响。
如果您使用的是框架模块,则模拟在单元测试和功能测试中有效。