Php 将类型传递给SplObserver更新方法

Php 将类型传递给SplObserver更新方法,php,unit-testing,observer-pattern,mockery,Php,Unit Testing,Observer Pattern,Mockery,我有一个state对象,它扩展了实现SplSubject的基本抽象类 然后,该状态被传递给observer notify方法,但是我的单元测试和IDE对涉及的类型进行了投诉 abstract class TQ_Type implements \SplObserver { public function update(TQ_State $tq_state) { ... } } abstract class TQ_State implements \SplSu

我有一个state对象,它扩展了实现SplSubject的基本抽象类

然后,该状态被传递给observer notify方法,但是我的单元测试和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)兼容

我从这些派生类中派生,这些派生类是单元测试的主题

这是一个嘲弄不尊重它所嘲弄的对象的层次结构的问题吗

注意:我在这里使用了一个部分模拟,因为实际模拟返回一个mockry\compositeexpection,但我稍后会处理这个问题。

Derp代表我

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

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);
    }
}