php单元测试模拟set方法的属性

时间:2017-07-14 02:30:02

标签: php unit-testing phpunit

我正在学习php单元测试。我有疑问;如何从方法设置属性值?这是我的示例代码:

chomp($line);
my @fields = split(/\t/, $line, -1);
if ($fields[0] ne "") {
    $key = join(';', @fields);
    next;
}

my (undef, $item, $group, $colinfo) = @fields;
$hash->{$key}{$item} = [ $group, $colinfo ];

与上面的代码一样,我知道,我可以通过以下方式设置属性class Variables { public $date; public function setDate(\DateTime $date) { $this->date = $date; } } class Process { public function process(Variables $var) { if ($var->date->getTimeStamp() > 0) { return 'success'; } return 'failed'; } } class ProcessTest extends PHPUnit_Framework_TestCase { public function testProcess() { $mock = \Mockery::mock('Variables'); $mock->date = new \DateTime(); $procy = new Process(); $actual = $procy->process($mock); $this->assertEquals('success', $actual); } }

date

因为它是公开的。

如果属性$mock->date = new \DateTime(); 是私有的还是受保护的,该怎么办?如何设置嘲弄?我试图做这样的事情,但是出了个错误。

date

描述我的问题的示例类:

$mock->shouldReceive('setDate')->once()->andSet('date', new \DateTime());

我需要你的建议。

1 个答案:

答案 0 :(得分:0)

您可能会向Variables添加一个访问者,在Process::process()中使用它而不是访问public属性,因此,您必须设置一个期望访问者是调用Process::process()时调用:

$date = new \DateTime();

$variables = \Mockery::mock('Variables');

$variables->shouldReceive('getDate')->withNoArgs()->andReturn($date);

$process = new Process();

$this->assertSame('success', $process->process($variables));

供参考,见: