Php 拉威尔5模型模拟

Php 拉威尔5模型模拟,php,phpunit,laravel-5,mockery,Php,Phpunit,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 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';
    }
}
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);
    }
}
像这样的价值模型

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';
    }
}
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测试是这样的

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';
    }
}
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输出“再见”,我认为我在告诉它在模拟中返回“你好”,但它没有。你知道我做错了什么吗?

如评论中所述:

更改
return(new\App\Models\Value())->hello()返回(\App::make('App\Models\Value'))->hello()


在测试中:
$a=new\App\Models\Attribute()带有
$a=App::make('App\Models\Attribute')因此Laravel将通过容器解析依赖关系

如果更改$a=new\App\Models\Attribute(),会发生什么情况;使用$a=App::make('App\Models\Value')?如果我这样做,它将基本上与调用
$mock->hello()
相同。不确定是否清楚,但我试图模拟
属性所使用的响应。如果我调用$mock->hello(),它将返回预期的“hello”值。你是对的,我对这两个类感到困惑,我认为如果你更改return(new\App\Models\value())->hello(),它应该可以工作;返回(App::make('App\Models\Value'))->hello();在测试中:$a=new\App\Models\Attribute();使用$a=App::make('App\Models\Attribute');所以Laravel将通过容器解决依赖关系。是的,你是对的,我认为这是你可能建议的路径,并开始遵循它,但遇到了一些障碍。你的提示让我更深入地挖掘并尝试一些有效的方法,除非你愿意,否则我会回答我自己的问题。在模型中,必须执行
\App::make('Blah')
,否则名称空间将杀死它