具有依赖性和部分模拟PhpUnit的测试方法

时间:2014-02-24 11:52:28

标签: unit-testing mocking phpunit mockery

我在测试这个简单的方法时遇到了一些问题。

我检查是否存在与属于要测试的类的方法的对话,然后我使用依赖方法删除该对话。

问题是我无法弄清楚在我测试方法之后如何通过依赖模拟删除因为我已经模拟了主类来测试传递依赖性以确保该类被部分模拟。

这是我原来的方法

    <?php

    /**
    * Remove the current user to be fan the current team
    *
    * @param $user_id (int) | current user id
    * @param $team_id (int) | current team id
    * @return bool | true | false
    */
    public function remove($user_id, $team_id) {

        try 
        {
            $fan = $this->check($user_id,$team_id);
            $this->fan->delete($fan->id); // this->fan is the dependency on my constructor
            return true;
        } 
        catch(FanNotFoundException $e) 
        {
            $this->errors = $e->message();
            return false;
        }

    }

我的测试给了我一个错误:

  

test_remove_fan_from_db尝试获取非对象的属性

我猜是因为。在我测试了依赖项的删除方法之前,我部分地模拟了主类,但我认为没有其他方法可以模拟部分主类“Team”来测试check方法。但后来我必须传递该类测试的删除方法。怎么样?

<?php

public function test_remove_fan_from_db() {

        $mockInterface = m::mock('Core\Social\Fan\Repository\FanTeamRepositoryInterface');
        $mocked = m::mock('Core\Social\Fan\Entity\Team[check]',[$mockInterface]);

        $mocked->shouldReceive('check')
                        ->with(1,2)
                        ->once()
                        ->andReturn(true);

        $mockInterface->shouldReceive('delete')
                            ->with(1)
                            ->andReturn(true);

        $team = $mocked->remove(1,2);

        $this->assertTrue( $team );
    }

1 个答案:

答案 0 :(得分:0)

我做了一个初学者错误,我解决了这个问题:

public function test_remove_fan_from_db() {

        $mockInterface = m::mock('Core\Social\Fan\Repository\FanTeamRepositoryInterface');

        $mockInterface->shouldReceive('delete')
                            ->once()
                            ->andReturn(true);

        $mocked = m::mock('Core\Social\Fan\Entity\Team[check]',[$mockInterface]);

        $mocked->shouldReceive('check')
                        ->with(1,2)
                        ->once()
                        ->andReturn(new Fans);

        $team = $mocked->remove(1,2);

        $this->assertTrue( $team );
    }