簡體   English   中英

使用phpunit和Mockery模擬Laravel 5.2本地范圍

[英]Mocking Laravel 5.2 local scope with phpunit and Mockery

我正在使用Laravel 5.2,phpunit 5.0.0和PHP 7.0.3,並嘗試使用數據庫交互編寫測試,該測試涉及Eloquent模型范圍方法。

我有類似的東西:

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());
    }
}

我使用Picture記錄為數據庫播種,其中名稱設置為“test”。

我想的第一件事是我不必模擬范圍調用,因為我需要的只是在數據庫中。 並且由於(非簡化的)代碼我在測試之外工作,我猜范圍調用在phpunit中不起作用。 (我得到了“試圖獲取非對象屬性”的例外)。

好的,所以我試着用Mockery來模擬這個電話:

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());
    }
}

我得到的是“無法加載模擬App \\ Models \\ Picture,類已經存在”。 那么我怎樣才能正確模擬查詢范圍調用,如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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM