Издеваться над красноречивой моделью

Я просмотрел буквально сотни страниц, и я не могу найти то, что отличает мою ситуацию от рабочих примеров, которые я нашел на этих страницах.

Я использую Laravel 4.2, PHPUnit 4.3.1 и последнюю версию Mockery от Composer. Я запускаю тест PHPUnit на своем контроллере AppController и хочу перехватить функцию сохранения в базе данных Eloquent путем насмешки над моделью. Хотя при создании макета ошибок не возникает, макет также не прикрепляется к моей модели, поэтому строки все еще создаются.

Что мне здесь не хватает? Спасибо!

Моя ошибка от издевательства: Mockery\Exception\InvalidCountException: Method save() from Mockery_0_EventRsvp should be called exactly 1 times but called 0 times.

// Located at /app/tests/app/AppControllerTest.php
class AppControllerTest extends TestCase {
    public function setUp() {
        parent::setUp();
        Session::start();
        Mail::pretend();
    }
    public function tearDown() {
        parent::tearDown();
        \Mockery::close();
    } 
    public function testPostApp() {
        $myvar = array();
        $this->mock = \Mockery::mock('Eloquent','EventRsvp');
        $this->app->instance('EventRsvp', $this->mock);
        $this->mock
                ->shouldReceive('save')
                ->once()
                ->andReturn('true');
        $response = $this->call('POST', '/3tDYSL0', $myvar);
    }
}

// Located at /app/controllers/AppController
class AppController extends BaseController {
    public function saveApp($shortUrl){
        $rsvp = new EventRsvp;
        $rsvp->fieldone = '124';
        $rsvp->fieldtwo = '30233';
        $rsvp->save();

        $returnredirect = Redirect::to(Request::path(). '/complete');
        return $returnredirect;
    }
}

// Located at /app/models/EventRsvp.php
<?
class EventRsvp extends Eloquent {

    protected $guarded = array('id');
    use Illuminate\Database\Eloquent\SoftDeletingTrait;
    protected $dates = ['deleted_at'];

    public function relationshipone()
    {
        return $this->belongsTo('RelationshipOne','idone');
    }

    public function relationshiptwo()
    {
        return $this->belongsTo('RelationshipTwo','idtwo');
    }

}
?>

1 ответ

Решение

Используйте внедрение зависимости вместо вызова new EventRsvp,

Вы можете захотеть создать репозиторий, который обеспечит EventRsvpс вашего контроллера, то вы можете легко смоделировать репо и внедрить его вместо реального.

Просто чтобы вы знали, хотя возможно достичь того, что вы пытались, я бы этого не сделал:

$mock = Mockery::mock('overload:EventRsvp');
$mock->shouldReceive('save')->once()->andReturn(true);

$response = $this->call('POST', '/3tDYSL0', $myvar);

Это пример издевательства над издевательством, и он поймает new EventRsvp позвоните в свой контроллер, и используйте это $mock вместо реальной модели. Но опять же, используйте внедрение зависимостей, это то, что вы хотите.

Другие вопросы по тегам