将类型传递给SplObserver更新方法

时间:2014-12-05 10:37:00

标签: php unit-testing observer-pattern mockery

我有一个状态对象,它扩展了一个实现SplSubject的基础抽象类。

然后将此状态传递给观察者通知方法 - 我的单元测试和IDE抱怨所涉及的类型。

abstract class TQ_Type implements \SplObserver
{
    public function update(TQ_State $tq_state)
    {
       ...
    }
}

abstract class TQ_State implements \SplSubject
{
    public function __construct()
    {
        $this->observers = new SplObjectStorage;
    }

    public function attach(TQ_Type $observer)
    {
        $this->observers->attach($observer);
    }

    public function detach(TQ_Type $observer)
    {
        $this->observers->detach($observer);
    }

    public function notify()
    {
        foreach ($this->observers as $observer)
        {
            $observer->update($this);
        }
    }
}

以下测试产生:PHP致命错误:TQ_State :: attach()的声明必须与SplSubject :: attach(SplObserver $ SplObserver)兼容

class TQTypeStandardAppealTest extends PHGUnit_Internal
{
    private $under_test;

    public function setUp()
    {
        $this->under_test =  new TQ_Type_StandardAppeal();
    }

    public function test_pending_standard_appeal_tq_approval_hits_states_notify_method()
    {
        $state = Mockery::mock('TQ_State_Pending')->makePartial();
        $state->shouldReceive('get_event')
            ->withNoArgs()
            ->andReturn('Approve');
        $this->under_test->update($state);
    }
}

我从这些派生出来,那些派生类是单元测试的主题......

这是一个问题,其中嘲弄不尊重它正在嘲笑的对象的层次结构

注意我在这里使用了部分模拟,因为实际的模拟会返回一个Mockery \ CompositeExpectation但我稍后会处理它。

1 个答案:

答案 0 :(得分:-1)

Derp代表我。

简单和简单这些必须尊重接口的合同,因此它们必须具有SplObserver和SplSubject。必须在该方法中处理任何进一步要求限制非正确类型的对象触发观察者更新方法的能力。