Издеваться над красноречивой моделью
Я просмотрел буквально сотни страниц, и я не могу найти то, что отличает мою ситуацию от рабочих примеров, которые я нашел на этих страницах.
Я использую 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
вместо реальной модели. Но опять же, используйте внедрение зависимостей, это то, что вы хотите.