使用testdox-html生成日志文件时,显示的结果只是测试方法的名称,如果失败则通过文本进行,如果通过则为正常.我想要的是testdox文件生成错误信息,就像命令行输出一样.这是可能吗?
如何在"PHP内"运行测试而不是使用'phpunit'命令?例:
<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class MySeleniumTest extends PHPUnit_Extensions_SeleniumTestCase {
protected function setUp() {
$this->setBrowser("*firefox");
$this->setBrowserUrl("http://example.com/");
}
public function testMyTestCase() {
$this->open("/");
$this->click("//a[@href='/contact/']");
}
}
$test = new MySeleniumTest();
//I want to run the test and get information about the results so I can store them in the database, send an email etc.
?>
Run Code Online (Sandbox Code Playgroud)
或者我是否必须将测试写入文件,通过system()/ exec()调用phpunit并解析输出?:(
我正在尝试使用PHPUnit对mapper类进行单元测试.我可以轻松地模拟将在mapper类中注入的PDO实例,但我无法弄清楚如何模拟PreparedStatement类,因为它是由PDO类生成的.
在我的情况下,我已经扩展了PDO类,所以我有这个:
public function __construct($dsn, $user, $pass, $driverOptions)
{
//...
parent::__construct($dsn, $user, $pass, $driverOptions);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS,
array('Core_Db_Driver_PDOStatement', array($this)));
}
Run Code Online (Sandbox Code Playgroud)
关键是Core_Db_Driver_PDOStatement没有注入PDO类的构造函数中,它是静态实例化的.即使我这样做:
public function __construct($dsn, $user, $pass, $driverOptions, $stmtClass = 'Core_Db_Driver_PDOStatement')
{
//...
parent::__construct($dsn, $user, $pass, $driverOptions);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS,
array($stmtClass, array($this)));
}
Run Code Online (Sandbox Code Playgroud)
...它仍然是一个静态的实例,因为我无法传递我自己的预处理语句类的模拟实例.
任何的想法 ?
编辑:解决方案,改编自anwser:
/**
* @codeCoverageIgnore
*/
private function getDbStub($result)
{
$STMTstub = $this->getMock('PDOStatement');
$STMTstub->expects($this->any())
->method('fetchAll')
->will($this->returnValue($result));
$PDOstub = $this->getMock('mockPDO');
$PDOstub->expects($this->any())
->method('prepare')
->will($this->returnValue($STMTstub));
return $PDOstub;
}
public function testGetFooById()
{
$arrResult = array( ... );
$PDOstub = $this->getDbStub($arrResult);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用在create调用某个方法时抛出异常的存根来测试try/catch块.它工作正常,异常被引发,但它不是我的应用程序捕获它,它停止测试的执行.有什么更好的方法可以做到这一点.
<?php
// TestCase
$mockDao->expects($this->once())
->method('create')
->will($this->throwException(new \Exception));
$service->addEntity($data);
?>
<?php
// Service
public function addEntity($data)
{
....
try {
...
$this->create($entity); // Test Halts with Exception
...
} catch (Exception $e) {
// Never Gets Called
$this->handleException($e);
}
}
Run Code Online (Sandbox Code Playgroud) 我目前有一个Socket类,它基本上只是PHP socket_*函数的OO包装类:
class Socket {
public function __construct(...) {
$this->_resource = socket_create(...);
}
public function send($data) {
socket_send($this->_resource, $data, ...);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我不认为我可以模拟套接字资源,因为我使用PHP的套接字函数,所以现在我不知道如何可靠地单元测试这个类.
我正在构建一组RESTful API,现在需要为它们编写单元测试.我不确定单元测试应该实际测试什么.
单元测试是否应检查从服务器接收的响应是否适用于各种输入?如果是这样,预先定义一组正确的响应格式并检查针对它们的响应是否是一种好习惯?
UPDATE
我通过CURL调用这些服务,我绝对可以检查状态代码.对于不同的输入,响应可能会有所不同,因此我应该检查所有可能的响应吗?
通常如何使用PHPUnit对RESTful API进行单元测试?
我有读取器类从stdin读取并返回readed值.
class Reader
{
const STREAM_READ = 'php://stdin';
private $_streamHandle;
public function __construct($stream = self::STREAM_READ)
{
$this->_streamHandle = fopen($stream, 'r');
}
public function getReadedValue()
{
$value = trim(fgets($this->_streamHandle));
return $value;
}
public function __destruct()
{
fclose($this->_streamHandle);
}
}
Run Code Online (Sandbox Code Playgroud)
现在是我的问题,我如何测试这个类,从stdin读取一些东西并按getReadedValue()函数返回readed值?
我对Zend和单元测试都很陌生.我想出了一个使用Zend Framework 2和Doctrine的小应用程序.它只有一个模型和控制器,我想对它们运行一些单元测试.
这是我到目前为止所拥有的:
基础学说"实体"类,包含我想在所有实体中使用的方法:
<?php
/**
* Base entity class containing some functionality that will be used by all
* entities
*/
namespace Perceptive\Database;
use Zend\Validator\ValidatorChain;
class Entity{
//An array of validators for various fields in this entity
protected $validators;
/**
* Returns the properties of this object as an array for ease of use. Will
* return only properties with the ORM\Column annotation as this way we know
* for sure that it is a column with data …Run Code Online (Sandbox Code Playgroud) 所有PHPUnit测试完成后,我可以自动运行PHP脚本吗?
在完成所有测试后,我想报告一些非致命问题(即正确但不是最理想的测试结果).
我尝试在PhpUnit中的WebTestCase中发送原始数据,但它不起作用:
$jsonEvent = '{
"type": "invoice.payment_succeeded",
}';
$this->client->request(
'POST',
'/api/v1/stripe/webhook',
[],
[],
['CONTENT_TYPE' => 'application/json'],
$jsonEvent
);
Run Code Online (Sandbox Code Playgroud)
我尝试获取这样的数据:
$input = file_get_contents("php://input");
var_dump($input);
Run Code Online (Sandbox Code Playgroud)
但是$input空的
不确定但是也许不可能在webtestcase中获得类似的内容输入?
提前致谢.