在我的Symfony 2.1应用程序中,我无法运行推荐的 phpunit -c app/.我收到以下错误消息(我添加了换行符):
PHPUnit 3.6.10 by Sebastian Bergmann.
Configuration read from /symfony2-dual-auth/app/phpunit.xml.dist
F
PHP Fatal error: main(): Failed opening required
'/symfony2-dual-auth/vendor/symfony/symfony/vendor/autoload.php'
(include_path='.:/usr/share/php:/usr/share/pear')
in /symfony2-dual-auth/vendor/symfony/symfony/autoload.php.dist on line 3
Run Code Online (Sandbox Code Playgroud)
这里有完整的源代码:https://github.com/meonkeys/symfony2-dual-auth.除了测试,因为它没有通过.这是src/Oh/FOSFacebookUserBundle/Tests/SimpleFunctionalTest.php......
<?php
namespace Oh\FOSFacebookUserBundle\Tests;
use Symfony\Bundle\FrameworkBundle\Tests\Functional\WebTestCase;
class SimpleFunctionTest extends WebTestCase {
public function testIndex() {
$client = static::createClient();
$crawler = $client->request('GET', '/login');
$this->assertEquals(1, $crawler->filter('html:contains("Remember me")')->count());
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在努力让我们的系统与PHPUnit更加兼容,所以我们可以对我们的类进行更多的单元测试,并设法让它们中的一些使用模拟对象,但我遇到了一个我看不出的问题到处走走
我们拥有的一个类(我正在创建一个模拟版本)用于查询.您将查询字符串传递给它的"query()"方法,它会记录查询,运行它并返回结果.它还使用名为"get_row()"的方法包装mysql_fetch_assoc,该方法返回与原始数据类似的数组值.
问题在于,在某些方法中,有多个查询被传递给"query()"方法,因此需要运行多个while循环以将数据加载到不同的变量中.我在下面创建了一个简化版本:
class object{
public function __construct($query){
$this->query = $query;
}
public function loadData(){
$data1 = queryDataSource("SELECT * FROM data1");
$data2 = queryDataSource("SELECT * FROM data2");
return Array(
"data1" => $data1,
"data2" => $data2,
);
}
private function queryDataSource($query){
$this->query->query($query)
while($row = $this->query->get_row()){
$result[] = $row;
}
return $result
}
}
class testObject extends PHPUnit_Framework_TestCase{
method testLoadData(){
$test_data = Array('name' => 'Bob', 'number' => '98210');
$query = $this->getMock('Query');
$query->expects($this->any())->method('query');
$query->expects($this->at(1))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(2))->method('get_row')->will($this->returnValue(False);
$query->expects($this->at(3))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(4))->method('get_row')->will($this->returnValue(False);
}
}
Run Code Online (Sandbox Code Playgroud)
为了逃避$ object-> queryDataSource()中的第一个while循环,我返回一个布尔FALSE值,就像执行mysql_fetch_assoc时一样.问题是,当它试图运行第二个查询并通过get_row()获取数据时,模拟对象似乎继续返回FALSE ratehr而不是继续到at(3)点.即使有4个对象也会发生这种情况,只有第一个会将测试数据作为返回值,然后第二次得到FALSE,其他的每次都会得到FALSE. …
class Documentation
{
private $_text;
public function __construct($text)
{
$this->_text = $text;
}
public function generate()
{
return new \DOMElement('documentation', $this->_text);
}
}
Run Code Online (Sandbox Code Playgroud)
我能想到的显而易见的解决方案是创建new DOMDocument,追加generate()函数调用的结果并与使用的期望元素进行比较$this->assertEqualXMLStructure,但由于某种原因我不喜欢它并且确定有其他选择.
有任何想法吗?
UPD:好像我错过了一些重要的东西:我想确定的是返回具有特定内容的特定类型的元素.怎么做?
UPD 2:
这是我目前可以创造的,但它很难看,不是吗?
public function testGenerate()
{
$expected = new \DOMDocument();
$expected->loadXML('<?xml version="1.0" encoding="utf-8"?><documentation>foo</documentation>');
$documentation = new Documentation('foo');
$actual = new \DOMDocument('1.0', 'utf-8');
$actual->appendChild($documentation->generate());
$this->assertEqualXMLStructure($expected, $actual);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用PHPUnit测试Symfony2项目中使用的类的私有方法.我正在使用许多开发人员描述的私有方法测试策略(通过反射),例如http://aaronsaray.com/blog/2011/08/16/testing-protected-and-private-attributes-and-methods-using -phpunit /
但不幸的是,我收到以下错误:
有1个错误:1)我的\ CalendarBundle\Tests\Calendar\CalendarTest :: testCalculateDaysPreviousMonth ReflectionException:类日历不存在/Library/WebServer/Documents/calendar/src/My/CalendarBundle/Tests/Calendar/CalendarTest.php:47
<?php
namespace My\CalendarBundle\Tests\Calendar;
use My\CalendarBundle\Calendar\Calendar;
class CalendarTest
{
//this method works fine
public function testGetNextYear()
{
$this->calendar = new Calendar('12', '2012', $this->get('translator'));
$result = $this->calendar->getNextYear();
$this->assertEquals(2013, $result);
}
public function testCalculateDaysPreviousMonth()
{
$reflectionCalendar = new \ReflectionClass('Calendar'); //this is the line
$method = $reflectionCalendar->getMethod('calculateDaysPreviousMonth');
$method->setAccessible(true);
$this->assertEquals(5, $method->invokeArgs($this->calendar, array()));
}
}
Run Code Online (Sandbox Code Playgroud)
为什么?
先感谢您
我正在使用PHPUnit来测试我的代码但是当我使用assertTrue时,phpunit表现得很好.这是phpunit的正常行为吗?我收到以下错误.
声明1为真的失败.
我有一个我创建的基本ZF2 InputFilter.我如何使用PHPUnit测试它而不将其附加到表单?
我找不到任何关于如何做的样本.希望有人可以帮忙.
我正在使用laravel和PHPunit的padraic/mockery包.我使用的是PHP 5.4.3.
在尝试创建模拟对象以测试控制器时,我收到错误:
"BadMethodCallException: Method ... shouldRecieve() is not found on this mock object"
Run Code Online (Sandbox Code Playgroud)
我的代码如下,我正在非常仔细地阅读一个教程,但无法理解为什么我的模拟对象似乎没有正确实例化.
public function testItWorks()
{
$mocked = m::mock('SearchRepositoryInterface');
App::instance('SearchRepositoryInterface', $mocked);
$mocked->shouldRecieve('test')->once()->andReturn('NOT hitting the db');
$response = $this->call('GET', 'search');
$this->assertTrue($response->isOK());
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用DB适配器的模型,我想测试.DB适配器的构造函数处理所有数据库连接,所以我想在测试期间避免它,否则它会返回有关db pass/db username等未设置的错误.
我正在运行的代码如下所示,因为您看到我正在使用disableOriginalConstructor()以防止调用构造函数.
问题是,我得到这个错误,当我尝试使用$mysql_stub在will():
参数1传递给PHPUnit_Framework_MockObject_Builder_InvocationMocker ::会()必须实现接口PHPUnit_Framework_MockObject_Stub,Mock_Pages_MySQL_Page_46612429的情况下给出的,称为/Applications/MAMP/htdocs/lib/Pages/trunk/Tests/Unit/PageTest.php线185和定义
有人可以建议,正确的语法是什么?
class Page {
public function getByUrl($url)
{
$db_page = $this->getDAOInterface();
$db_page->getByUrl($url);
$this->assign($db_page);
return $this;
}
}
class PageTest extends PHPUnit_Framework_TestCase
{
public function testGetByUrl()
{
$test_url = "foo-bar";
$page_stub = $this->getMock(
'Pages_Model_Page',
array('getDAOInterface', 'assign')
);
$mysql_stub = $this->getMockBuilder('Pages_MySQL_Page')
->setMethods(array('getByUrl'))
->disableOriginalConstructor()
->getMock();
$mysql_stub->expects($this->once())
->method('getByUrl')
->with($this->equalTo($test_url));
$page_stub->expects($this->once())
->method('getDAOInterface')
->with()
->will($mysql_stub);
$page_stub->expects($this->once())
->method('assign')
->with($mysql_stub);
$page_stub->geByUrl($test_url);
}
}
Run Code Online (Sandbox Code Playgroud) 在运行PHPUnit测试时,会创建许多连接但不会关闭.我可以看到这个
mysql> show processlist;
Run Code Online (Sandbox Code Playgroud)
在我的数据库类中,我通过实现PHPUnit_Extensions_Database_TestCase#getConnection()来创建数据库连接.
我确保在拆解时连接关闭.请参阅代码段:
<?php
abstract class My_Tests_DatabaseTestCase extends \PHPUnit_Extensions_Database_TestCase
{
static private $pdo = null;
private $conn = null;
/**
* @throws RuntimeException
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
final public function getConnection()
{
$iniFilePath = __DIR__ . '/../../../db-config.ini';
$iniFile = parse_ini_file($iniFilePath, true);
$dsn = "mysql:dbname=".$iniFile['phpunit']['dbname'].";host=".$iniFile['phpunit']['host'];
if ( $this->conn === null ) {
if ( self::$pdo == null ) {
self::$pdo = new \PDO($dsn, $iniFile['phpunit']['user'], $iniFile['phpunit']['password']);
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, $iniFile['phpunit']['dbname']);
}
return $this->conn;
}
protected function getSetUpOperation()
{ …Run Code Online (Sandbox Code Playgroud) 我为我的一个模块创建了一个数据库测试类.当我尝试运行测试用例时,初始夹具未设置 - 测试数据库中的所有表都是空的.这是我的getDataSet()方法:
/**
* @return PHPUnit_Extensions_Database_DataSet_IDataSet
*/
public function getDataSet()
{
return $this->createFlatXMLDataSet(dirname(__FILE__).'/dataSets/initial.xml');
}
Run Code Online (Sandbox Code Playgroud)
我发现getDataSet()方法被调用,因为当我在其中创建语法错误时,测试执行失败.但是当我在文件initial.xml中创建错误时,没有任何反应.似乎文件initial.xml根本没有被解析!
该文件的路径应该没问题,但我注意到当我输入无效路径时,没有任何事情发生.显然,方法createFlatXMLDataSet()在出错时不会抛出任何异常.所以现在我没有任何线索为什么它不起作用:(