4

Ardentパッケージが何をしているかをシミュレートしようとしています。保存する直前にモデルを検証しています。

私はこれを作成しましたBaseModel(本によるとLaravel Testing decoded)。そして、このコードを追加しました:

class BaseModel extends Eloquent {
    protected static $rules = [];
    public $errors = [];

    public function validate(){
        $v = Validator::make($this->attributes, static::$rules);

        if($v->passes()) {
            return true;
        }

        $this->errors = $v->messages();

        return false;
    }

    public static function boot(){
        parent::boot();
        static::saving(function($model){
            if($model->validate() === true){
                foreach ($model->attributes as $key => $value) {
                    if(preg_match("/[a-zA-Z]+_confirmation/", $key)){
                        array_splice($model->attributes, array_search($key, array_keys($model->attributes)), 1);
                    }
                }
                echo "test"; //This is for debugging if this event is fired or not
                return true;
            } else {
                return false;
            }
        });
    }
}

さて、これは私のPostモデルです:

class Post extends BaseModel {
    public static $rules = array(
            'body' => 'required',
            'user_id' => 'required',
        );

}

このテストでは、失敗することを期待しています。代わりに、合格です!、$post->save()真を返します!

class PostTest extends TestCase {

    public function testSavingPost(){
        $post = new Post();
        $this->assertFalse($post->save());
    }
}

イベントecho内にステートメントをスローしようとしたとき。saving表示されなかったので、定義しsavingたイベントが呼び出されていないことを理解しています。どうしてか分かりません。

4

2 に答える 2

7

この議論をチェックしてください: https://github.com/laravel/framework/issues/1181

おそらく、テストでイベントを再登録する必要があります。

class PostTest extends TestCase {

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

        // add this to remove all event listeners
        Post::flushEventListeners();
        // reboot the static to reattach listeners
        Post::boot();
    }

    public function testSavingPost(){
        $post = new Post();
        $this->assertFalse($post->save());
    }
}

または、イベント登録機能をブート関数から public static メソッドに抽出する必要があります。

  class Post extends Model {

       protected static boot()
       {
           parent::boot();
           static::registerEventListeners();
       }

       protected static registerEventListeners()
       {
           static::saving(...);
           static::creating(...);
           ...etc.
       }

  }

そして、Post::flushEventListeners(); を呼び出します。Post::registerEventListeners(); setUp() テスト メソッドで。

于 2014-04-07T22:41:43.237 に答える
2

保存イベントは私にとっては問題ないようです。検証に失敗したため、$post->save()false を返します。$post->save()false ( ) であると予想されるため、テストはパスしassertFalseます。この場合は正しいです。代わりにこれらのテストを試してください。

public function testSavingInvalidPost() {
    $post = new Post();
    $this->assertFalse($post->save());
}

public function testSavingValidPost() {
    $post = new Post();
    $post->body = 'Content';
    $post->user_id = 1;
    $this->assertTrue($post->save());
}
于 2013-09-12T08:09:21.653 に答える