<?php
class Game
{
public $db;
public function __construct()
{
$this->db = new DB;
}
public function result()
{
return $this->db->data();
}
}
<?php
class DB
{
public function data()
{
return false;
}
}
<?php
use Mockery as m;
class GameTest extends PHPUnit_Framework_TestCase
{
public function testResult()
{
$game = m::mock(new Game);
$game->shouldReceive('data')
->once()
->andReturn(true);
$expected = $game->result();
$this->assertTrue($expected);
}
public function tearDown()
{
m::close();
}
}
这是我的解决方案,但完全没有用,我想如果我想从__construct
设置我需要模拟一个新类,我得到消息Failed asserting that false is true.
这意味着模拟的东西不起作用,怎么处理呢?
答案 0 :(得分:0)
你不能这样做,最好的解决方案是使用$ db的依赖注入。 这样你就可以像这样只模拟数据库......
$dbMock = m::mock('DB');
$dbMock->shouldReceive('data')
->once()
->andReturn(true);
或者你可以保留像这样的构造函数(没有DI),但你也必须模拟那个构造函数。
答案 1 :(得分:0)
您可以通过创建&#34;实例模拟&#34;来使用Mockery。对于这样的DB类:
$dbMock = Mockery::mock('overload:MyNamespace\DB');
这将&#34;拦截&#34;当创建一个新的DB类实例时,将使用$ dbMock。创建$dbMock
时,您只需要为给定方法添加期望声明:
$dbMock->shouldReceive('data')
->once()
->andReturn(true);