【发布时间】:2013-06-25 19:46:13
【问题描述】:
我开始使用 Silex,感觉非常棒。尝试对我的课程进行适当的单元测试时会出现问题。具体来说,闭包:( 在以下几行中,我解释了我的问题,看看你们中是否有人知道如何解决它。 请不要关注语法,而要关注测试问题本身。
我有这样的提供者:
<?php
namespace Foo\Provider;
use Silex\Application;
use Silex\ServiceProviderInterface;
use Foo\Bar;
class BarProvider implements ServiceProviderInterface {
public function register( Application $app ) {
$app[ 'foo_bar' ] = $app->protect( function() use ( $app ) {
return new Bar( $app );
} );
}
public function boot( Application $app ) {}
}
然后我需要获取一个 foo_bar 元素的实例:
<?php
namespace Foo;
use Silex\Application;
class Clazz {
protected $bar;
public function __construct( Application $app ) {
$this->bar = $app[ 'foo_bar' ]();
}
}
这很好用。问题是我正在使用 TDD(和 PHPUnit)进行开发,我无法正确测试 Clazz 类。
<?php
namespace Foo\Test;
use PHPUnit_Framework_TestCase;
use Silex\Application;
use Foo\Bar;
use Foo\Clazz;
class ClazzTest extends PHPUnit_Framework_TestCase {
public function testConstruct() {
$mock_bar = $this->getMock( 'Foo\Bar' );
$mock_app = $this->getMock( 'Silex\Application' );
$mock_app
->expects( $this->once() )
->method( 'offsetGet' )
->with( 'foo_bar' )
->will( $this->returnValue( $mock_bar ) );
new Class( $mock_app );
}
}
这里的问题在于 Clazz 类中 $app[ 'foo_bar' ] 之后的“()”。 尝试执行测试时,我收到“PHP 致命错误:函数名称必须是...中的字符串”错误。 我知道我无法以这种方式对课程进行单元测试,但我没有看到正确的方法。
我如何测试这个语句(因为最后唯一的复杂语句是 $this->bar = $app 'foo_bar' ; )?
【问题讨论】:
-
或许github能给你一些启发:github.com/fabpot/Silex/tree/master/tests/Silex/Tests
-
我已经尝试过了,但找不到一个好的例子:(
标签: testing phpunit closures silex