2015-05-26 63 views
2

我在不同的地方看過幾篇文章,他們似乎都有類似的答案。然而,對於我的生活,我無法讓Mockery對象正常工作。Laravel 5 Model mocking

屬性模型看起來像這樣

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Attribute extends Model { 

    public function test() 
    { 
     return (new \App\Models\Value())->hello(); 
    } 
} 

這樣

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Value extends Model 
{ 
    public function hello() 
    { 
     return 'goodbye'; 
    } 
} 

PHPUnit的測試看起來像這樣

use App\Models\Attribute; 

class AttributeModelTest extends TestCase 
{ 
    public function testThing() 
    { 
     $mock = Mockery::mock('\App\Models\Value'); 

     $mock->shouldReceive('hello') 
      ->once() 
      ->andReturn('hello'); 

     $this->app->instance('\App\Models\Value', $mock); 

     $a = new \App\Models\Attribute(); 
     $return = $a->test(); 
     var_dump($return); 
    } 
} 

PHPUnit的輸出 '再見',值模型,其中我儘管我告訴它在模擬中返回'你好',但事實並非如此。任何想法我可能做錯了什麼?

+0

如果更改,會發生什麼* $ A =解決依賴性new \ App \ Models \ Attribute(); * with * $ a = App :: make('App \ Models \ Value'); *? – marcanuy

+0

如果我這樣做,它將基本上與調用'$ mock-> hello()'相同。不知道是否清楚,但我試圖嘲笑「屬性」使用的響應。如果我調用$ mock-> hello()它會返回期望值'hello' – Catharsis

+0

你說得對,我在兩個類之間感到困惑,我認爲它應該能夠工作,如果你改變* return(new \ App \ Models \ Value )) - > hello(); *和* return(App :: make('App \ Models \ Value')) - > hello(); *在測試中:* $ a = new \ App \ Models \ Attribute (); * with * $ a = App :: make('App \ Models \ Attribute'); *所以Laravel將通過容器解析依賴關係。 – marcanuy

回答

1

正如評論討論:

變化return (new \App\Models\Value())->hello();return (\App::make('App\Models\Value'))->hello();

而且在測試:$a = new \App\Models\Attribute();$a = App::make('App\Models\Attribute');所以Laravel將通過容器