Laravel 5 模型模拟

Laravel 5 Model mocking

我在不同的地方看到了一些关于这个的帖子,他们似乎都有相似的答案。然而,对于我来说,我无法让 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 输出 'goodbye',虽然我在模拟中告诉它 return 'hello' 但它没有。知道我可能做错了什么吗?

如评论中所述:

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 将通过容器解决依赖关系