laravel可测试存储方法,在basemodel中进行验证

时间:2013-07-28 22:53:03

标签: unit-testing tdd phpunit laravel laravel-4

我正在尝试测试创建一个关注者,但是,因为我正在调用Auth :: user() - > id我得到错误“试图获取非对象的属性”。目前我一直在构建输入数组,当我运行create方法时,验证是从BaseModel中的引导方法触发的。有没有办法我可以模拟$ input数组,还是应该在我的存储库中的create方法中进行验证?

<?php

class FollowersTest extends TestCase {

public function setUp()
{
  parent::setUp();

  $this->mock = $this->mock('Convoconnect\Storage\Follower\FollowerRepository');
}

public function mock($class)
{
  $mock = Mockery::mock($class);

  $this->app->instance($class, $mock);

  return $mock;
}

public function tearDown()
{
  Mockery::close();
}

/**
 * Test Store success
 */
public function testStoreSuccess()
{
  $input = [
    'user_id' => 1,
    'follower_id' => 4,
  ];

    $this->mock
        ->shouldReceive('create')
        ->once();

  $this->call('POST', 'followers', $input);

  $this->assertRedirectedToRoute('followers.index');
 }
}



<?php

use Convoconnect\Storage\Follower\FollowerRepository as Follower;

class FollowersController extends BaseController {

/**
* Follower Repository
*
* @var Follower
*/
protected $follower;

public function __construct(Follower $follower) {
    $this->follower = $follower;
}

public function store() {

    $input = [
        'user_id' => Auth::user()->id,
        'follower_id' => Input::get('follower_id'),
    ];

    $follower = $this->follower->create($input);

    if($follower->save()) return Redirect::route('followers.index');

    return Redirect::back()
        ->withInput()
        ->withErrors($follower->errors);
 }
}   

1 个答案:

答案 0 :(得分:1)

您可以模拟Validator行为:

Validator::shouldReceive('make')
    ->once()
    ->andReturn(Mockery::mock(array('fails' => true)));

this Nettuts article中有关于测试控制器的大量有用信息。 Jeffrey Way的书Laravel Testing Decoded,也值得一看。