Game.php
<?php
class Game
{
public $db;
public function __construct()
{
$this->db = new DB;
}
public function result()
{
return $this->db->data();
}
}
DB.php
<?php
class DB
{
public function data()
{
return false;
}
}
GameTest.php
<?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.
,这意味着模拟的东西不工作,如何处理它?
发布于 2015-09-29 14:21:26
你不能这样做,最好的解决方案是对$db使用依赖注入。这样你就只能这样模拟DB了.
$dbMock = m::mock('DB');
$dbMock->shouldReceive('data')
->once()
->andReturn(true);
或者你可以像这样保留你的构造函数(没有依赖注入),但是你也必须模拟这个构造函数。
发布于 2016-02-01 14:42:30
您可以通过为DB类创建一个“实例模拟”来使用模拟,如下所示:
$dbMock = Mockery::mock('overload:MyNamespace\DB');
这将在创建DB类的新实例并使用$dbMock时进行“拦截”。在创建$dbMock
时,您只需要为给定的方法添加一个期望声明:
$dbMock->shouldReceive('data')
->once()
->andReturn(true);
https://stackoverflow.com/questions/32747460
复制相似问题