【问题标题】:Passing type to SplObserver update method将类型传递给 SplObserver 更新方法
【发布时间】:2015-02-03 12:13:09
【问题描述】:

我有一个状态对象,它扩展了实现 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,但我稍后会处理。

【问题讨论】:

    标签: php unit-testing observer-pattern mockery


    【解决方案1】:

    代表我的 Derp。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多