我在codeigniter上运行PHPunit测试,我有一段带有这段代码的admin_test.PHP文件.
class Admin_test extends PHPUnit_Framework_TestCase{
private $CI;
public function __construct()
{
// create instance variable
$this->CI = &get_instance();
}
public function testRenderReturnsHelloWorld(){
$this->CI->load->controller('admin');
$data = $this->admin->render();
$expected = 'Hello World';
$this->assertEquals($expected, $data);
}
}
PHP Fatal error: Call to undefined function get_instance() in C:\Users\farhana\Desktop\ci\tests\application\controllers\admin_test.PHP on line 16
PHP Stack trace:
PHP 1. {main}()
我使用composer来获得PHPunit测试,所以在其他教程之后无法工作,因为composer正在加载bootstrap.PHP文件
<?xml version="1.0" encoding="UTF-8" ?>
<PHPunit bootstrap="./vendor/autoload.PHP"
color = "true"
convertErrorsToExpections="true"
convertNoticesToExceptions="true"
convertWarningsToExpections="true"
SyntaxCheck="false"
>
<testsuites>
<testsuite name="Unit Tests">
<directory>./tests/application/controllers/admin_test.PHP</directory>
</testsuite>
</testsuites>
</PHPunit>
解决方法:
我对CI并不熟悉,但有机会使用使用它的代码库.问题是函数& get_isntance()在system/core/CodeIgniter.php文件中定义.所以(似乎)你可以包含它以便能够使用该功能(你可以创建一些特殊的引导程序文件,包含这个文件和vendor / autoload.PHP).
我通过意图强调’似乎’,因为实际上该文件已经为某些常量设置了一些要求(以及其他一些已完成的东西 – 如index文件中所述).除了定义get_instance函数之外,它还有很多side-effects – 它包含其他文件,实例化对象(也可以自己创建作业),注册错误和异常处理程序,处理404情况,创建控制器及其运行方法,运行它,调用钩子并在所有这些之间进行基准测试.基本上大多数这些操作与测试过程无关,特别是在谈论单元测试时.所以我认为包含该文件并不是一个好主意(尽管可能有用 – 我没有检查).
这使得一个人可以选择 – 检查所有CI引导代码并提取所有适合并且需要进行单元测试并运行它们的东西.或者放弃基于CI的代码进行单元测试的想法,尝试不那么深入和更集成的东西:Codeception提供的functional/acceptance测试(或搜索其他类似的工具).
就个人而言,我认为第一种选择不值得做出这些努力的原因很明显.因此,如果您必须执行CI并且想要进行一些测试,那么不进入其内部并专注于要测试的代码的外部边界将更有效率.
(不能说我已经完成了对基于CI的代码进行实际单元测试的全面覆盖和全面搜索,但似乎(即使只考虑关于该主题的SO主题的简短搜索)这是一个非常大的问题.所以如果你设法解决任何问题,那么看看你采取的方法会很有趣.)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。