0

私は Laravel と Mockery を使用した単体テストにかなり慣れていないため、次のテストを作成しました。通用しそうです。しかし、おそらくもっと良い方法で書くことができると思います。実装よりもテストの方が壊れやすいようです。これを行うためのより良い方法はありますか?

ItemModelTest.php

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

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

    return $mock;
}

// It seems like this test might be more likely to break then the method itself.
public function testCatTree() {
    $categoryMock = $this->mock("Category");
    $categoryMock->shouldReceive("getAttribute")->with("name")->times(3)
        ->andReturn("self","parent1","parent2");

    $categoryMock->shouldReceive("getAttribute")->with("parent")->times(3)
        ->andReturn($categoryMock, $categoryMock, null);

    $i = new Item;
    $i->setAttribute("category",$categoryMock);
    $tree = $i->catTree;
    Should::equal("parent2 > parent1 > self", $tree);
}

アイテム.php

class Item extends Eloquent {
    public function category() {
        return $this->belongsTo("Category");
    }

    public function getCatTreeAttribute() {
        $category = $this->category;
        if(!$category) return "";
        $tree = array($category->name);
        $parent = $category->parent;
        while($parent) {
            $tree[] = $parent->name;
            $parent = $parent->parent;
        }
        return implode(" > ", array_reverse($tree));
    }
}

カテゴリ.php*

class Category extends Eloquent {

    public function getParentAttribute() {
        return $this->belongsTo('Category','parent_id');
    }

}
4

1 に答える 1

1

私はそれがあまりにも悪いとは思わない。

テストは決して「壊れる」べきではありません - もしそうなら、それはあなたのメソッドが最初に壊れたことを意味するからです。それがテストを受ける理由です。

メソッドを変更する必要がある場合は、最初に新しいテストを作成します (つまり、テスト駆動開発)。

Laravel 4 でのテストに関する Jeffery Way eBook を読むことを検討してみてください。

于 2013-08-16T10:26:37.987 に答える