Mocking Laravel 5.2带有phpunit和Mockry的局部范围

Mocking Laravel 5.2带有phpunit和Mockry的局部范围,php,laravel,phpunit,mockery,Php,Laravel,Phpunit,Mockery,我正在使用Laravel5.2、phpunit 5.0.0和PHP7.0.3,并尝试编写一个与数据库交互的测试,该测试涉及一个雄辩的models scope方法 我有一个类似的想法: class Picture extends Illuminate\Database\Eloquent\Model { ... public function scopeGetPictureNameById($oQuery, $pictureHId) { return $oQuery

我正在使用Laravel5.2、phpunit 5.0.0和PHP7.0.3,并尝试编写一个与数据库交互的测试,该测试涉及一个雄辩的models scope方法

我有一个类似的想法:

class Picture extends Illuminate\Database\Eloquent\Model {
    ...
    public function scopeGetPictureNameById($oQuery, $pictureHId) {
         return $oQuery->select('name')->where('h_id', '=',   $pictureHId)->first()->name;
    }
}

class someHelperClass {
    public function someMethod($pictureId) {
        $pictureName = Picture::getPictureNameById($pictureId);
        return "name is " . $pictureName;
    }
}


class SomeTest extends TestCase {

    use DatabaseMigrations;

    protected $someHelper;

    public function setUp() {
        parent::setUp();
        $this->someHelper = new SomeHelper();
    }

    /**
     * @test
     */
    public function someMethodTest() {
        $expectedName = "test";
        $this->assertEquals("name is " . $expectedName, $this->someHelper->someMethod());
    }
}
我用一个图片记录为数据库种子,其中名称设置为“test”

我想到的第一件事是,我不必模拟范围调用,因为我所需要的只是数据库。由于我的(非简化)代码在测试之外工作,我猜范围调用在phpunit中不工作。 (我得到一个“尝试获取非对象的属性”异常)

好吧,我试着用嘲弄来嘲弄这个电话:

class SomeTest extends TestCase {

    use DatabaseMigrations;

    protected $someHelper;

    public function setUp() {
        parent::setUp();
        $this->someHelper = new SomeHelper();
    }

    /**
     * @test
     */
    public function someMethodTest() {
        $expectedName = "test";

        $mockedPicture = Mockery::mock('overload:App\Models\Picture');
        $mockedPicture->shouldReceive('getPictureNameById')->andReturn('test');

        //also tried this: $mockedPicture->shouldReceive('scopeGetPictureNameById')->andReturn('test');


        $this->assertEquals("name is " . $expectedName, $this->someHelper->someMethod());
    }
}

我得到的只是“无法加载模拟应用程序\模型\图片,类已经存在”。因此,如何正确模拟查询范围调用,如Picture::getPictureNameById($pictureId)?

我将使用依赖项注入,而不是静态调用Picture类上的方法。比如说:

class someHelperClass {

    protected $picture;

    public function __construct(Picture $picture) {
        $this->picture = $picture;
    }

    public function someMethod($pictureId) {
        $pictureName = $this->picture->getPictureNameById($pictureId);
        return "name is " . $pictureName;
    }
}
然后在你的测试中:

public function someMethodTest() {
    $expectedName = "test";

    $mockedPicture = Mockery::mock('App\Models\Picture');
    $mockedPicture->shouldReceive('getPictureNameById')->andReturn('test');
    $someHelper = new SomeHelper($mockedPicture);

    $this->assertEquals("name is " . $expectedName, $someHelper->someMethod(1));
}

我使用的是Laravel查询范围()。我怎样才能非静态地调用它们呢?如果像我的示例中那样使用依赖项注入,就可以这样做。也许可以澄清一下。这对你不管用吗?