测试php laravel controller shouldReceive参数

时间:2013-11-23 17:40:14

标签: php unit-testing laravel phpunit

我有一个使用热情/雄辩的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来替换表单中的输入,但似乎没有进入我的函数

如何在模拟对象中模拟表单输入?

由于

0 个答案:

没有答案