gpt4 book ai didi

使用 PHPUnit 在 Silex(模拟闭包)中进行测试

转载 作者:行者123 更新时间:2023-11-28 19:49:46 26 4
gpt4 key购买 nike

我开始使用 Silex,它非常棒。尝试对我的类(class)进行正确的单元测试时出现问题。具体闭包:(在接下来的几行中,我将解释我的问题,看看你们中是否有人知道如何解决它。请不要关注语法,而是测试问题本身。

我有这样的提供商:

<?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 类中 $a​​pp[ 'foo_bar' ] 之后的“()”。尝试执行测试时出现“PHP fatal error :函数名称必须是...中的字符串”错误。我知道我不能以这种方式对类(class)进行单元测试,但我看不到正确的方法。

我如何测试这个语句(因为最后唯一的复杂语句是 $this->bar = $app 'foo_bar' ; )?

最佳答案

好的,我想我成功地测试了这个闭包!最终测试如下所示:

<?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( function() use( $mock_bar ) { return $mock_bar; } ) );

new Class( $mock_app );
}
}

我没有返回模拟,而是返回一个返回模拟的闭包。这样我在使用实际模拟时就不会收到错误。

谁能告诉我这是否是正确的方法?

关于使用 PHPUnit 在 Silex(模拟闭包)中进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17306170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com