我有一个使用热情/雄辩的laravel模型。我正在尝试为控制器设置测试,特别是存储使用热心模型的新模型。
该方法适用于应用,但我的测试遇到了问题
我在弄清楚如何模拟这个方法所做的调用时遇到了问题。
我的控制器设置和问题的方法就是这个:
use golfmanager\service\creator\TicketCreatorInterface;
//controller manages the ticket books
class BooksController extends BaseController {
/**
* Book Repository
*
* @var Book
*/
protected $book;
protected $ticket;
public function __construct(Book $book, TicketCreatorInterface $ticket)
{
$this->book = $book;
$this->ticket = $ticket;
}
public function store()
{
$input = Input::all();
$result = $this->book->save();
if ($result) {
//if book created then create tickets
$this->ticket->createTicket($input, $this->book);
return Redirect::route('books.index');
}
return Redirect::route('books.create')
->withInput()
->withArdentErrors()
->with('message', 'There were validation errors.');
}
接口使用的方法(TicketCreator):
public function createTicket($input, $book) {
//dd($input);
$counter = $input['start_number'];
while($counter <= $input['end_number']) {
$ticketDetails = array(
'ticketnumber'=>$counter,
'status'=>'unused',
'active'=>1
);
$this->ticket->create($ticketDetails)->save();
$this->ticket->book()->associate($book)->save();
$counter = $counter+1;
}
return $counter;
}
我的测试如下:
use Mockery as m;
use Way\Tests\Factory;
class BooksTest extends TestCase {
public function __construct()
{
$this->mock = m::mock('Ardent', 'Book');
$this->collection = m::mock('Illuminate\Database\Eloquent\Collection')->shouldDeferMissing();
}
public function setUp()
{
parent::setUp();
$this->attributes = Factory::book(['id' => 1, 'assigned_date'=> '20/11/2013']);
$this->app->instance('Book', $this->mock);
}
public function testStore()
{
Input::replace($input = ['start_number'=>1000, 'end_number'=>1010, 'assigned_date'=>'20/11/2013']);
$this->mock->shouldReceive('save')->once()->andReturn(true);
$this->ticket->shouldReceive('createTicket')->once()->with($input, $this->mock)->andReturn(true);
//with($input);
//$this->validate(true);
$this->call('POST', 'books');
$this->assertRedirectedToRoute('books.index');
}
目前我收到错误:
No matching handler found for Book::save()
是否因为书籍模型不包含保存方法而被抛出?如果是我如何正确模拟模型。我不希望它触及数据库(尽管如果必须的话)。 它是createTicket方法中的多个保存吗?
还在学习如何正确设置测试 - 慢慢到那里但还没有足够的知识。
如果我将shouldReceive中方法的名称更改为'store',它仍然会出现save()错误消息。
更新 我已将问题的一部分与createTicket调用隔离开来。我已经改变了我的testStore测试并更新了如上所述。
我当前测试的错误是:Undefined index: start_number
。
如果我在控制器方法中删除对createTicket的调用,则不会出现错误。我尝试使用Input :: replace来替换表单中的输入,但似乎没有进入我的函数
如何在模拟对象中模拟表单输入?
由于