如何测试使用构造变量的类方法

时间:2015-09-23 19:00:08

标签: php phpunit mockery

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.这意味着模拟的东西不起作用,怎么处理呢?

2 个答案:

答案 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);