2013-11-29 3 views
1

Я новичок в TDD, поэтому извините меня, если это вопрос о нобе.Тестовые отношения в Laravel 4 с FactoryMuff

У меня есть пользователи и проекты, связанные с 2 различными способами:

  1. проект, принадлежит пользователю
  2. Многие пользователи могут быть уполномочены многих проектов.

Я следую этому руководству http://net.tutsplus.com/tutorials/php/testing-like-a-boss-in-laravel-models/?search_index=16, поэтому я использую FactoryMuff.

Это мой класс проекта:

<?php 
use LaravelBook\Ardent\Ardent; 
class Project extends Ardent 
{ 
    /** 
    * Ardent validation rules 
    */ 
    public static $rules = array(
     'name' => 'required',    // Project Title 
     'user_id' => 'required|numeric', // User owner id 
    ); 

    /** 
    * Array used by FactoryMuff to create Test objects 
    */ 
    public static $factory = array(
     'name' => 'string', 
     'user_id' => 'factory|User', // Will be the id of an existent User. 
    ); 

    /** 
    * Belongs to user 
    */ 
    public function owner() 
    { 
     return $this->belongsTo('User', 'user_id'); 
    } 

    /** 
    * Many Users can be authorized 
    */ 
    public function authorized() 
    { 
     return $this->belongsToMany('User', 'project_user', 'project_id', 'user_id')->withTimestamps(); 
    } 

} 

И это мой класс User:

<?php 

use Zizaco\Entrust\HasRole; 
use Zizaco\Confide\ConfideUser; 

class User extends ConfideUser { 

    /** 
    * Ardent validation rules 
    */ 
    public static $rules = array(
     'username' => 'required|min:4|unique:users', 
     'email' => 'required|email|unique:users', 
     'password'    => 'required|between:4,16|confirmed', 
     'password_confirmation' => 'required|between:4,16', 
    ); 

    /** 
    * Array used by FactoryMuff to create Test objects 
    */ 
    public static $factory = array(
     'username' => 'string', 
     'email' => 'email', 
     'password' => '12345', 
     'password_confirmation' => '12345', 
    ); 

    (more code) 

    /** 
    * Many Users can be authorized on many Projects 
    */ 
    public function authorized() 
    { 
     return $this->belongsToMany('Project', 'project_user', 'user_id', 'project_id')->withTimestamps(); 
    } 

    /** 
    * Users can have many Projects 
    */ 
    public function projects() 
    { 
     return $this->hasMany('Project'); 
    } 

} 

И это мой ProjectTest:

<?php 
use Zizaco\FactoryMuff\Facade\FactoryMuff; 
use Way\Tests\Factory; 
class ProjectTest extends TestCase 
{ 
    use Way\Tests\ModelHelpers; 
    /** 
    * Test relationship with User 
    */ 
    public function testRelationshipWithUser() 
    { 
     // Instantiate new Project 
     $project = FactoryMuff::create('Project'); 

     $this->assertEquals($project->user_id, $project->owner->id); 
    } 

    /** 
    * Test relationship with Authorized Users 
    */ 
    public function testRelationshipWithAuthorizedUsers() 
    { 
     // Instantiate new Project 
     $project = FactoryMuff::create('Project'); 
     $project->save(); 
     $project->authorized()->attach($project->user_id); 

     $this->assertEquals($project->user_id, $project->authorized->first()->id); 
    } 

} 

Если я запускаю тесты по отдельности (комментируя другой), оба проходят. Однако, если я бег и я получаю эту ошибку:

Caused by 
PDOException: SQLSTATE[HY000]: General error: 1 table users has no column named password_confirmation 

Почему жалуется этим столбцом во втором тесте, а не в первую очередь? : S

+0

Это не так много! Многим для многих требуется сводная таблица, например. project_user – Adamski

ответ

1

Вам необходимо установить public $autoPurgeRedundantAttributes = true; на вашу модель User.

Ardent (в котором Confide extends from) автоматически очистит поля _confirmation, но по умолчанию он установлен в значение false.

+0

Теперь я получаю это:) ProjectModelTest :: testRelationshipWithAuthorizedUsers Исключение: SQLSTATE [23000]: нарушение ограничений целостности: 19 users.confirmation_code может не быть NULL (SQL: вставить в «пользователей» («имя пользователя», «письмо», пароль "," updated_at "," created_at ") значения (?,?,?,?,?)) (Привязки: array ( 0 => 'Course', 1 => '[email protected]', 2 => '$ 2y $ 08 $ 6UVyR53rqyqpq613tEqsLOvJYD6QfNfkELbnhPS0pjt4H8KAMxt1a', 3 => '2013-12-04 20:39:22', 4 => '2013-12-04 20:39:22', )) – Cmorales

+1

Вы возможно, придется предоставить 'confirm_code' на вашем заводе. По какой-то причине метод 'beforeSave' не должен запускаться. – philipbrown

Смежные вопросы