我在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);
}
}
当我运行phpunit测试时,我收到此错误。
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测试,因此在编写器加载bootstrap.php文件后,其他教程也无法工作
这是我的phpunit.xml文件
<?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>
答案 0 :(得分:0)
我对CI并不熟悉,但有机会使用使用它的代码库。问题是function &get_isntance()
文件中定义了include
。所以(似乎)你可以vendor/autoload.php
它能够使用该函数(你可以创建一些特殊的引导文件,包含这个文件和get_instance
)。
我通过意图强调'似乎',因为实际上该文件有一些已经设置的常量的预先设定(以及其他一些事情 - 如system/core/CodeIgniter.php文件中所述)。除了定义include
函数之外,它还有很多index - 它False
的其他文件,实例化对象(也可以自己创建作业),注册错误和异常处理程序,句柄404情况,创建conroller及其运行方法,运行它,调用钩子并在所有这些之间进行基准测试。基本上大多数这些操作与测试过程无关,特别是在谈论单元测试时。所以我认为包含该文件并不是一个好主意(尽管可能有用 - 我没有检查)。
留下一个选择 - 要么检查所有CI引导代码并提取所有适合并且需要进行单元测试并运行它们的东西。或者放弃基于CI的代码进行单元测试的想法,尝试更深入,更整合的东西:Codeception提供的side-effects测试(或搜索其他类似的工具)。
就我个人而言,我认为第一种选择并不值得做出明显的理由。因此,如果您必须执行CI并且想要进行一些测试,那么不进入其内部并专注于要测试的代码的外部边界将更有效率。
(不能说我已经对基于CI的代码进行了真正的单元测试进行了全面覆盖和全面的搜索,但似乎(即使只考虑关于该主题的SO主题的简短搜索)它是相当的因此,如果你设法解决任何问题,那么看看你采取的方法会很有趣。)
答案 1 :(得分:0)
对于其他为此感到困扰的人,请尝试rougin/spark-plug
答案 2 :(得分:0)
您的行显示为:
$this->CI = &get_instance();
但是必须是:
$this->CI =& get_instance();