Насмешка над моделью Laravel 5

Я видел несколько сообщений об этом в разных местах, и все они, кажется, имеют похожий ответ. Однако для жизни я не могу заставить объект Mockery работать должным образом.

Модель атрибута выглядит так

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 выводит «до свидания», хотя я говорю ему вернуть «привет» в макете, а это не так. Любые идеи, что я могу делать неправильно?


person Catharsis    schedule 26.05.2015    source источник
comment
Что произойдет, если вы замените $a = new \App\Models\Attribute(); на $a = App::make('App\Models\Value'); ?   -  person marcanuy    schedule 26.05.2015
comment
Если я это сделаю, это будет в основном то же самое, что и вызов $mock->hello(). Не уверен, понятно ли это, но я пытаюсь издеваться над ответом, который использует Attribute. если я вызываю $mock-›hello(), он возвращает ожидаемое значение «hello»   -  person Catharsis    schedule 26.05.2015
comment
Вы правы, я запутался между обоими классами, я думаю, это должно работать, если вы измените 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 разрешит зависимости через контейнер.   -  person marcanuy    schedule 26.05.2015
comment
Да, вы правы, я подумал, что это путь, который вы можете предложить, и начал следовать ему, но врезался в стену. Ваша подсказка заставила меня копнуть немного глубже и попробовать что-то, что работает, я отвечу на свой вопрос, если вы этого не хотите. В модели важно сделать \App::make('Blah'), иначе пространство имен убьет ее.   -  person Catharsis    schedule 26.05.2015


Ответы (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 разрешал зависимости через контейнер

person marcanuy    schedule 26.05.2015