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