2015-05-26 5 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(); 
    } 
} 

Модель Value как этот

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

Что произойдет, если вы измените * $ а = new \ App \ Models \ Attribute(); * с * $ 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(); * с * $ 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 рассосется зависимости через контейнер