我试图对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
}
}
我似乎无法弄清楚如何将属性分配给模拟的应用程序。 有没有人有想法?
答案 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
方法,因此该方法需要在那里。