我有一个类似于此的类(为简洁起见,删除了一些逻辑):
class FooCollection {
protected $_foos;
public function __construct() {
$this->_foos = new SplObjectStorage();
}
public function addFoo(FooInterface $foo) {
$this->_foos->attach($foo);
}
public function removeFoo(FooInterface $foo) {
$this->_foos->detach($foo);
}
}
Run Code Online (Sandbox Code Playgroud)
我想用PHPUnit 来测试addFoo()和removeFoo()方法,我想知道最好的策略是什么呢?据我所知,我只有几个选择:
hasFoo(FooInterface $foo)并在添加后检查此方法.getFoos()直接返回SplObjectStorage实例的方法,并$foo在添加后检查是否在其中.removeFoo($foo)之后addFoo($foo)并检查异常.$_foos公共财产并在添加后直接检查(坏,坏,坏......).选项#1和#2正在改变公共接口仅用于测试目的,我不确定我对此的看法.它们似乎是非常通用的,有用的方法,但在我的特定情况下,我从来不需要检查Foo集合中特定实例的存在,也不需要检索所有实例,所以它真的会只是臃肿.此外,似乎如果我在一次测试中测试界面的多个部分,我不是真的在测试一个"单位",但这或多或少只是一个哲学挂断.
选项#3对我来说似乎很尴尬.
选项#4是一个非常糟糕的主意,我甚至不应该列出它,因为即使在这里建议,我也不会这样做.
我确定我测试的数组是null.甚至做var_dump(array)印刷品array(0) {
}.
但测试$this->assertNull($array);失败了.
相反,当我测试下面的代码时,它进入if条件:
if ($array == null) {
echo "Entered";
} else {
echo "Not Entered";
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样.如果有人知道原因,请解释我.
我需要在测试开始时最大化我的窗口,然后我找到了这个类PHPUnit_Extensions_Selenium2TestCase_Window.
所以我尝试使用这种方法,$this->maximize()但我只是得到了
BadMethodCallException:命令'maximize'不存在或不受支持.
有人知道怎么做吗?
我正在尝试在我的PHP应用程序(Symfony2)中使用Jenkins和Ant,但无法执行我的测试.我可以在Jenkins的"控制台输出"屏幕中看到正在读取正确的配置文件,但它显示没有执行任何测试.
当我从项目的根目录中运行cli中的Ant build.xml文件时,构建成功并且我的测试执行并通过.
如果我进入/Users/Shared/Jenkins/ {....}/workspace目录并运行'sudo ant',它表示没有执行任何测试!这是令人困惑的,因为完全相同的build.xml文件在从我的项目根目录运行时执行测试.
我的buil.xml文件的相关部分是:
<target name="phpunit" description="Run unit tests with PHPUnit">
<exec executable="phpunit" failonerror="true">
<arg value="-c" />
<arg path="${workspace}/app/phpunit.xml.dist" />
</exec>
</target>
Run Code Online (Sandbox Code Playgroud)
app/phpunit.xml看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit
backupGlobals = "false"
backupStaticAttributes = "false"
colors = "true"
convertErrorsToExceptions = "true"
convertNoticesToExceptions = "true"
convertWarningsToExceptions = "true"
processIsolation = "false"
stopOnFailure = "false"
syntaxCheck = "false"
bootstrap = "bootstrap.php.cache" >
<testsuites>
<testsuite name="Project Test Suite">
<directory>../src/*/*Bundle/Tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>../src</directory>
<exclude>
<directory>../src/*/*Bundle/Resources</directory>
<directory>../src/*/*Bundle/Tests</directory>
<directory>../src/*/Bundle/*Bundle/Resources</directory>
<directory>../src/*/Bundle/*Bundle/Tests</directory> …Run Code Online (Sandbox Code Playgroud) 我想在运行OSX 10.8.4的本地机器和PHP 5.4.1的MAMP Pro上使用phpunit测试.此外,我想将它用于Yii和我的IDE Netbeans.
我通过pear阅读了一些像这种方法的教程,或者通过作曲家阅读这个教程.我甚至试图在Windows上看起来像ppl一样- 没有成功.
我的方法总是导致错误
PHP警告:include():打开'PHP_Invoker.php'失败
PHP警告:include():打开'PHPUnit_Extensions_Database_TestCase.php'失败
PHP警告:include():打开'PHPUnit_Extensions_Story_TestCase.php'失败
打开所需的'PHPUnit/Extensions/SeleniumTestCase.php'失败
PHP致命错误:找不到类'CTestCase'
或者根本找不到phpunit.
我有一个phpunit.xml,它定义了要测试的测试以及bootstrap文件的位置.我还想在phpunit.xml中定义可以在bootstrap期间访问的参数.
这是我的phpunit.xml:
<phpunit bootstrap="./bootstrap.php" colors="true" bootstrapArg="abcdefgh">
<testsuite name="TestSuite">
<file>./Test1.php</file>
<file>./Test2.php</file>
</testsuite></phpunit>
Run Code Online (Sandbox Code Playgroud)
我想在bootstrap.php中访问"bootstrapArg"的值.这可能吗?
谢谢
在每次测试开始时截断数据库的最佳解决方案是什么?我有带有Foreigh键的InnoDB引擎,无法截断表。
UPDATE
我已经解决了这个问题,这是所有关于正确的权限app/cache和app/logs.
当我尝试在symfony2中运行PHPUnit时,使用此命令phpunit -c app/我收到以下错误消息:
PHPUnit 3.7.28 by Sebastian Bergmann.
Configuration read from /var/www/task/app/phpunit.xml.dist
PHP Warning: Uncaught exception 'PHPUnit_Framework_Error_Warning' with message 'require_once(/var/www/task/vendor/symfony/symfony/vendor/autoload.php): failed to open stream: No such file or directory' in /var/www/task/vendor/symfony/symfony/autoload.php.dist:9 Stack trace:
#0 /var/www/task/vendor/symfony/symfony/autoload.php.dist(9): PHPUnit_Util_ErrorHandler::handleError(2, 'require_once(/v...', '/var/www/task/v...', 9, Array)
#1 /var/www/task/vendor/symfony/symfony/autoload.php.dist(9): require_once()
#2 /var/www/task/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AppKernel.php(26): require_once('/var/www/task/v...')
#3 /var/www/task/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/WebTestCase.php(47): require_once('/var/www/task/v...')
#4 /var/www/task/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/WebTestCase.php(54): Symfony\Bundle\FrameworkBundle\Tests\Functional\WebTestCase::getKernelClass()
#5 /var/www/task/vendor/symfony/symfon in /var/www/task/vendor/symfony/symfony/autoload.php.dist on line 9
PHP Stack trace:
PHP 1. {main}() /home/rafael/composer-packages/vendor/phpunit/phpunit/composer/bin/phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() /home/rafael/composer-packages/vendor/phpunit/phpunit/composer/bin/phpunit:63
PHP 3. …Run Code Online (Sandbox Code Playgroud) 好的 - 我的岩石之路进入测试(与laravel)继续...
我已经创建了一个实例和一个'存储库',我现在正在尝试测试它.但是,这样做我得到一个错误,即找不到类中的方法.对我而言意味着至少找到了这门课程.
我在config/app.php中添加了以下内容:
//custom service providers
'GolfmanagerServiceProvider'
Run Code Online (Sandbox Code Playgroud)
我的服务提供商是:
class GolfmanagerServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind(
'golfmanager\service\creator\TicketCreatorInterface',
'golfmanager\service\creator\TicketCreator'
);
}
}
Run Code Online (Sandbox Code Playgroud)
我的界面是:
interface TicketCreatorInterface {
public function createTicket($input, $book);
}
Run Code Online (Sandbox Code Playgroud)
我的'存储库' (这是正确的术语吗?):
Class TicketCreator implements TicketCreatorInterface {
protected $ticket;
public function __construct(TicketAudit $ticketAudit)
{
$this->ticket = $ticketAudit;
}
public function createTicket($input, $book) {
$counter = $input['start'];
while($counter <= $input['end']) {
$this->$ticket->create(array(
'ticketnumber'=>$counter,
'status'=>'unused',
'active'=>1
));
$this->ticket->book()->associate($book);
$counter = $counter+1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
TicketAudit是雄辩的模型
到目前为止我的测试是:
public …Run Code Online (Sandbox Code Playgroud) 码:
MyMockClass.php
<?php
class MyMockClass
{
public function __construct($l)
{
// Do nothing with it
}
protected function loadData($var)
{
// Do something, it doesn't matter what
return null;
}
public function onEvent($key)
{
return $this->loadData($key);
}
}
Run Code Online (Sandbox Code Playgroud)
MockTest.php
<?php
class MockTest extends \PHPUnit_Framework_TestCase
{
public function testPHPUnitMock()
{
$mock = $this->getMockBuilder('MyMockClass')->setConstructorArgs(array(true))->getMock();
$mock->expects($this->once())->method('loadData')->with('TEST')->will($this >returnValue(true));
$this->assertEquals(true, $mock->onEvent('TEST'));
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此测试时,它失败,输出如下:
PHPUnit_Framework_ExpectationFailedException : Failed asserting that null matches expected true.
Expected :true
Actual :null
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行onEvent,这反过来执行我嘲笑的功能,并改变了结果.但是这个onEvent功能似乎没有被调用.如果我把mail()(或类似的东西)放入onEvent …