2017-02-10 100 views
1

需要一點幫助使用嘲笑 - 我想重載一個類,它是在方法中使用new HelperUtil()創建的。嘲笑超載類缺少方法

使用嘲笑overload我可以做到這一點,但它留給我一個空的殼類。我似乎必須創建所有被調用的方法。有沒有辦法創建一個重載的完整模擬,然後改變一個方法?

$mock = \Mockery::mock('overload:'.HelperUtil::class); 
    $mock->shouldReceive('content')->andReturnUsing(function() { 
     return 'different content'; 
    }); 

感謝

編輯: 我覺得我想要做的:

$mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldDeferMissing(); 
    $mock->shouldReceive('content')->andReturnUsing(function() { 
     return 'different content'; 
    }); 

但仍然dosnt工作=(

回答

1

有一個interesting discussion它在GitHub上

shouldIgnoreMissingshouldDeferMissing(和其他此類標誌 現在和未來)做的工作,但不是模擬,但在實例 模擬。

聽起來令人困惑,但這是因爲內部。

當你做一個m::mock('overload:Foo');嘲弄去,並創建一個基於Mock.php「模板」叫Foo新 類。並且該模板 默認情況下將_mockery_ignoreMissing標誌設置爲false。

一旦模擬方法結束,它會創建一個超載的對象並將其返回給我們。過載的Foo類也是 可用於實例化新的Foo對象。

調用$m->shouldIgnoreMissing()會設置由模擬方法返回的 對象上的ignore忽略標誌。

調用new Foo()創建具有_mockery_ignoreMissing假 的Mock.php模板默認Foo對象的新實例。

如果您希望該標誌在新實例上設置爲true,則需要在該實例上調用 shouldIgnoreMissing(),而不要在$m上調用該標誌。

依我之見,有「should ignore missing on instance mocks」已經完成,所以你能做的最好的是

$mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldIgnoreMissing(); 

我沒有看到shouldDeferMissing已經又做了overload

當然,作爲一種解決方法,您可以考慮創建一個模擬並注入它。