我正在尝试通过测试使用zend表达式构建的rest api控制器来学习PHPUnit,但是无法在线找到有关如何执行相同操作的任何资源。 Official documentation for zend framework中的代码不适用于zend表达。所以我尝试了PHPUnit documentation。
以下是我现在所做的事情: -
use App1\Api\AccountApi;
use PHPUnit\Framework\TestCase;
use PHPUnit\DbUnit\TestCaseTrait;
class AccountTest extends TestCase {
use TestCaseTrait;
static private $pdo = null;
private $conn = null;
public function setUp(){
/* Avoiding truncate operation of getDataSet() since we are trying to access view and not a table from database. */
}
public function getConnection() {
if ($this->conn === null) {
if (self::$pdo == null) {
self::$pdo = new PDO('mysql:host=localhost;dbname=workflow','root', 'root');
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, ':host=localhost;dbname=workflow');
}
return $this->conn;
}
public function getDataSet()
{
$dataset = $this->getConnection()->createDataSet();
return $dataset;
}
public function testIndexAction()
{
$api = new AccountApi();
$response = $api->indexAction(); // Invokes a findAll() operation in the model which basically does a 'select * from workflow.account'
print $response; // to see if a response is returning
}
}
但是当我运行上面的代码时,它会抛出这个错误:
1) AgentTest::testIndexAction
Zend\Db\Adapter\Exception\RuntimeException: Connect Error: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: No such host is k
nown.
C:\webserver\GIT\gco3api\vendor\zendframework\zend-db\src\Adapter\Driver\Pdo\Connection.php:283
C:\webserver\GIT\gco3api\vendor\zendframework\zend-db\src\Adapter\Driver\Pdo\Pdo.php:255
C:\webserver\GIT\gco3api\vendor\zendframework\zend-db\src\Sql\Sql.php:138
C:\webserver\GIT\gco3api\src\Core\src\Abstracts\Model.php:453
C:\webserver\GIT\gco3api\src\Core\src\Abstracts\Model.php:422
C:\webserver\GIT\gco3api\src\App1\src\Api\AccountApi.php:28
C:\webserver\GIT\gco3api\test\AppTest\App1\AccountTest.php:52
我真的不知道我使用PHPUnit测试其他api控制器的方法是否正确,因为我是php和phpunit的新手。我很感激帮助我指出正确的方向。
答案 0 :(得分:2)
好的,您的连接正常,但\Zend\Db\Adapter
不知道如何连接数据库。 Sql
对象需要Adapter
,所以我猜你在第453行Model.php
做了类似的事情:
$sql = new Sql($container->get('Adapter');
所以你的适配器工厂工作并检查db-connection的配置。但是你没有初始化freamwork。你没有读取你的配置,你的模块没有发送他们的配置。因为您刚刚使用new
关键字创建了控制器。
这不是freamwork运行atm,它只是phpunit。这就是Adapter
无法找到数据库的原因。你必须设置freamwork。
如果您在__construct
模式下编写代码,则可以通过Dependency Injection
方法设置适配器。这是我们遵循SOLID
原则的重要原因之一:Testable Code
。但好像你是通过抽象访问你的适配器。因此,您必须设置freamwork来测试该操作。
这是我从你的代码中理解的。如果有任何问题,请告诉我。