2016-04-02 15 views
2

Laravel 5.2, phpunit 5.0.0 ve PHP 7.0.3 kullanıyorum ve bir Eloquent modelleri kapsam yöntemine dokunan veritabanı etkileşimi ile bir test yazmaya çalışıyorum.Phpunit ve Mockery ile Laravel 5.2 yerel kapsamı alay

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

de ismi "test" olarak ayarlandığında bir Resim kaydı ile Veritabanı Tohum:

böyle bir şey var.

Düşündüğüm ilk şey, kapsam çağrısı ile dalga geçmek zorunda kalmamam gerektiğiydi, çünkü tek ihtiyacım olan Veritabanında. Ve (basitleştirilmemiş) kodun test dışında çalıştığından beri, bu kapsam çağrılarının phpunit'te çalışmadığını düşünüyorum. ("Nesne olmayan özellik özelliğini almaya çalışıyorum" İstisnası). Tamam

, bu yüzden alay çağrıyı alay etmeye çalıştı:

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

ı get "sahte App \ Modelleri \ resmi yüklenemedi, sınıf zaten var" dır. Peki, Resim :: getPictureNameById ($ pictureId) gibi sorgu kapsamı çağrılarını düzgün bir şekilde nasıl atabilirim?

cevap

1

Resim sınıfındaki yöntemleri statik olarak çağırmak yerine bağımlılık enjeksiyonu kullanıyorum. Yani böyle bir şey: senin testinde Sonra

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

: Ben laravel sorgu kapsamları kullanıyorum

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)); 
} 
+0

(https://laravel.com/docs/5.1/eloquent#query-scopes). Statik olmayan olarak nasıl arayabilirim? –

+0

Örnekte olduğu gibi bağımlılık enjeksiyonu kullanıyorsanız bunu yapabilirsiniz. Belki [bu yazı] (https://laracasts.com/discuss/channels/general-discussion/l5-facades-or-dependency-injection) açıklığa kavuşturuyor. Senin için işe yaramadı mı? –