使用PHPUnit在Silex(mock closures)中进行测试
发布时间:2020-05-25 09:01:32 所属栏目:PHP 来源:互联网
导读:我开始和Silex合作,这很棒.尝试对我的课程进行适当的单元测试时会出现问题.具体地说是封闭:( 在以下几行中,我解释了我的问题,看看你们中是否有人知道如何解决它. 请不要专注于语法,而应关注测试问题本身. 我有这样的提供者: ?phpnamespace FooProvider;use S
|
我开始和Silex合作,这很棒.尝试对我的课程进行适当的单元测试时会出现问题.具体地说是封闭:(
我有这样的提供者: <?php
namespace FooProvider;
use SilexApplication;
use SilexServiceProviderInterface;
use FooBar;
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 SilexApplication;
class Clazz {
protected $bar;
public function __construct( Application $app ) {
$this->bar = $app[ 'foo_bar' ]();
}
}
这很好用.问题是我正在使用TDD(和PHPUnit)进行开发,而且我无法正确测试Clazz类. <?php
namespace FooTest;
use PHPUnit_Framework_TestCase;
use SilexApplication;
use FooBar;
use FooClazz;
class ClazzTest extends PHPUnit_Framework_TestCase {
public function testConstruct() {
$mock_bar = $this->getMock( 'FooBar' );
$mock_app = $this->getMock( 'SilexApplication' );
$mock_app
->expects( $this->once() )
->method( 'offsetGet' )
->with( 'foo_bar' )
->will( $this->returnValue( $mock_bar ) );
new Class( $mock_app );
}
}
这里的问题在于Clazz类中$app [‘foo_bar’]之后的“()”. 我怎么能测试这个陈述(因为最后唯一复杂的陈述是$this-> bar = $app’foo_bar’;)? 好吧,我想我设法正确测试了这个关闭!最终测试如下:<?php
namespace FooTest;
use PHPUnit_Framework_TestCase;
use SilexApplication;
use FooBar;
use FooClazz;
class ClazzTest extends PHPUnit_Framework_TestCase {
public function testConstruct() {
$mock_bar = $this->getMock( 'FooBar' );
$mock_app = $this->getMock( 'SilexApplication' );
$mock_app
->expects( $this->once() )
->method( 'offsetGet' )
->with( 'foo_bar' )
->will( $this->returnValue( function() use( $mock_bar ) { return $mock_bar; } ) );
new Class( $mock_app );
}
}
而不是返回模拟,我返回一个返回模拟的闭包.这样我仍然可以在使用实际模拟时得到错误. 谁能告诉我这是否是正确的方法? (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
