2015-01-08 3 views
0

Я не могу понять, как я тестирую обновление моего контроллера. Я получаю следующее сообщение об ошибке:Unit Testing Обновление REST с помощью Laravel и Mockery

method update() from Mockery_0_App.... Should be called exactly 1 times but called 0 times. 

После того как я удалить, если заявление в обновлении (после проверки, если аллергия существует), я получаю следующее сообщение об ошибке в строке, где я добавить идентификатор в уникальную проверку правило:

Trying to get property of on object 

Мой код:

контроллер:

class AllergyController extends \App\Controllers\BaseController 
{ 
    public function __construct(IAllergyRepository $allergy){ 
     $this->allergy = $allergy; 
    } 

    ...other methods (index,show,destroy) ... 

    public function update($id) 
    { 
     $allergy = $this->allergy->find($id); 

     //if ($allergy != null) { 
      //define validation rules 
      $rules = array(
       'name' => Config::get('Patient::validation.allergy.edit.name') . $allergy->name 
      ); 

      //execute validation rules 
      $validator = Validator::make(Input::all(), $rules); 
      $validator->setAttributeNames(Config::get('Patient::validation.allergy.messages')); 

      if ($validator->fails()) { 
       return Response::json(array('status' => false, 'data' => $validator->messages())); 
      } else { 
       $allergy = $this->allergy->update($allergy, Input::all()); 

       if ($allergy) { 
        return Response::json(array('status' => true, 'data' => $allergy)); 
       } else { 
        $messages = new \Illuminate\Support\MessageBag; 
        $messages->add('error', 'Create failed! Please contact the site administrator or try again!'); 

        return Response::json(array('status' => false, 'data' => $messages)); 
       } 
      } 
     //} 
     $messages = new \Illuminate\Support\MessageBag; 
     $messages->add('error', 'Cannot update the allergy!'); 

     return Response::json(array('status' => false, 'data' => $messages)); 
    } 

} 

TestCase: класса AllergyControllerTest расширяет TestCase {

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

    $this->allergy = $this->mock('App\Modules\Patient\Repositories\IAllergyRepository'); 
} 

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

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

    return $mock; 
} 

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

public function testIndex() 
{ 
    $this->allergy->shouldReceive('all')->once(); 

    $this->call('GET', 'api/allergy'); 

    $this->assertResponseOk(); 
} 

...Other tests for Index and Show ... 

public function testUpdate() 
{ 
    $validator = Mockery::mock('stdClass'); 
    Validator::swap($validator); 

    $input = array('name' => 'bar'); 

    $this->allergy->shouldReceive('find')->with(1)->once(); 
    $validator->shouldReceive('make')->once()->andReturn($validator); 
    $validator->shouldReceive('setAttributeNames')->once(); 
    $validator->shouldReceive('fails')->once()->andReturn(false);; 
    $this->allergy->shouldReceive('update')->once(); 

    $this->call('PUT', 'api/allergy/1', $input); 

    $this->assertResponseOk(); 
} 

}

Config проверка правила файл:

return array(
    'allergy' => array(
     'add' => array(
      'name' => 'required|unique:Allergy' 
     ), 
     'edit' => array(
      'name' => 'required|unique:Allergy,name,' 
     ), 
     'messages' => array(
      'name' => 'Name' 
     ) 
    ) 
); 

Есть ли способ действительно издевается значение, заданные в правило проверки? Или что это лучший способ решить эту проблему?

ответ

0

Я изменил свой код на это, и теперь он работает!)

$validator = Mockery::mock('stdClass'); 
Validator::swap($validator); 

$allergyObj = Mockery::mock('stdClass'); 
$allergyObj->name = 1; 

$input = array('name' => 'bar'); 

$this->allergyRepo->shouldReceive('find')->with(1)->once()->andReturn($allergyObj); 
$validator->shouldReceive('make')->once()->andReturn($validator); 
$validator->shouldReceive('setAttributeNames')->once(); 
$validator->shouldReceive('fails')->once()->andReturn(false);; 
$this->allergyRepo->shouldReceive('update')->once(); 

$this->call('PUT', 'api/allergy/1', $input); 

$this->assertResponseOk();