2013-10-20 237 views
7
在PHP接口時

我曾嘲笑在PHP中使用嘲弄(即時通訊使用的laravel框架接口時遇到一個問題,但我不知道這是相關的。錯誤使用嘲諷嘲諷

我已經定義的接口

<?php namespace MyNamespace\SomeSubFolder; 

interface MyInterface { 

    public function method1(); 

} 

而且我有typehints上的方法,一個接口的類...

<?php namespace MyNamespace\SomeSubFolder; 

use MyNamespace\SomeSubFolder\MyInterface; 

class MyClass { 

    public function execute(MyInterface $interface) 
    { 
     //does some stuff here 

    } 
} 

...,我想測試MyClass的。我已經創建了一個測試,廁所KS是這樣的:

public function testExecute() 
{ 

    $mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface'); 

    $mock->shouldReceive('method1') 
     ->andReturn('foo'); 

    $myClass = new MyClass(); 

    $myClass->execute($mock); 

} 

當我運行測試我收到消息

「ErrorException:傳遞給MyClass的參數1 ::執行必須myNameSpace對象\ SomeSubFolder \ MyInterface的實例,Mockery_123465456實例給定....'

我不知道爲什麼。

在測試我已經試過如下:

$this->assertTrue(interface_exists('MyNamespace\SomeSubFolder\MyInterface')); 

$this->assertTrue($mock instanceof MyInterface); 

和都返回true,所以它看起來好像我已經創建和實例實現該接口,但是當我呼籲級IT的方法不同意。有任何想法嗎???

+0

我認爲你需要提供更多的代碼或實際代碼,這https://gist.github.com/davedevelopment/31b143fc44ec52fcc575按預期工作對我來說 –

+0

用嘲弄的時候,我得到這一點。我發現啓用進程隔離的運行測試可行(但這顯然比較慢)。 – Ross

+0

我記得有一個類似的問題,實際上是一個嘲笑中的錯誤。你能否更新Mockery到dev-master並查看問題是否仍然存在? – 2013-12-31 22:40:50

回答

-1

我認爲問題是與PHP類加載。您的'MyNamespace \ SomeSubFolder \ MyInterface'類不能從您的測試文件中獲得。

您需要修改composer.json以自動加載該名稱空間,否則您需要在測試頂部使用require_once('path/to/file/contained/namespace/MyInterface.php')。

雖然,當你嘗試interface_exists它似乎通過。當你嘲笑它時,你也可能拼錯了你的命名空間類。我也犯了這個錯誤。

在任何情況下,嘲笑無法看到該類存在,因此它只是發明一個。

您能提供您的完整測試來源嗎?

+0

他沒有使用構造函數。 –

+0

哦,你說得對。編輯我的答案。 – awei

10

您應該在模擬聲明中調用mock()方法。

$mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface'); 

$mock->shouldReceive('method1') 
    ->andReturn('foo') 
    ->mock(); 
+0

它的作品,但爲什麼? –