将属性分配给Silex应用程序以进行单元测试

时间:2014-05-30 13:13:23

标签: php phpunit silex

我试图对Silex应用程序进行单元测试。 这是我测试的代码:

use Silex\Application;

class MyUser
{
    public function run(Application $app)
    {
        // show what $app['env'] actually contains
        var_dump($app['env']);

        if ($app['env'] == 'prod') {
            return true;
        } else {
            return false;
        }       
    }
}

我做了以下测试课:

class TestMyUser extends \PHPUnit_Framework_TestCase
{
    public function setup()
    {
        $this->app = $this->getMockBuilder('\Application')
                     ->disableOriginalConstructor()
                     ->getMock();

        $this->myUser = new MyUser();
    }

    public function testRun()
    {
        $this->app['env']    = 'prod'; // this outputs NULL
        $this->app->env      = 'prod'; // this outputs NULL
        $this->values['env'] = 'prod'; // this throws an error saying that values is a protected property
        $result = $this->myUser->run($this->app);
        $this->assertEquals(true, $result); // will always fail as $app['env'] is NULL
    }

}

我似乎无法弄清楚如何将属性分配给模拟的应用程序。 有没有人有想法?

2 个答案:

答案 0 :(得分:0)

使“values”模拟属性可访问:

public function testRun()
{
    $reflection = new ReflectionClass($this->myUser);
    $reflection_property = $reflection->getProperty('values');
    $reflection_property->setAccessible(true);

    $values = $reflection_property->getValue('values');
    $values['env'] = 'prod';
    $reflection_property->setValue('values', $values);

    $result = $this->myUser->run($this->app);
    $this->assertEquals(true, $result); // will always fail as $app['env'] is NULL
}

答案 1 :(得分:0)

我自己就是这样做的。根据您的代码示例创建该模拟时,它不会实现任何Application的方法。如果您希望方法仍然存在于模拟中,则需要调整模拟:

$this->app = $this->getMockBuilder('\Application') ->disableOriginalConstructor() ->setMethods(null) // you need this ->getMock();

给予setMethods null意味着不会嘲笑其任何方法。我认为根本不会调用setMethods会产生同样的效果,但是:没有。

执行此操作时:

$this->app['env'] = 'prod';

它正在调用Application的offsetSet方法,因此该方法需要在那里。