2016/02/28

Laravel PHPUnit Note (Basic 1)

# create a laravel project
composer create-project laravel/laravel app

# create alias to quick access phpunit
alias phpunit=vendor/bin/phpunit

# create unit test folder
mkdir tests/unit

# create a unit test for Product model
php artisan make:test unit/ProductTest

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ProductTest extends TestCase
{

    protected $product;

    public function setUp()
    {
        $this->product = new Product('Fallout 4', 59);
    }

    /** @test */
    public function a_product_has_a_name()
    {
        $this->assertEquals('Fallout 4', $this->product->name());
    }

    /** @test */
    public function a_product_has_a_price()
    {
        $this->assertEquals(59, $this->product->price());
    }
}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Product extends Model
{

    protected $name;
    protected $price;

    public function __construct($name, $price)
    {
        $this->name = $name;
        $this->price = $price;
    }

    public function name()
    {
    	return $this->name;
    }

    public function price()
    {
        return $this->price;
    }
}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class OrderTest extends TestCase
{
    /** @test */
    public function an_order_consists_of_products()
    {
        $order = $this->createOrder();

        $this->assertEquals(2, count($order->products()));

    }

    /** @test */
    public function an_order_can_determine_the_total_cost_of_all_its_products()
    {
        $order = $this->createOrder();

        $this->assertEquals(66, $order->total());
    }

    protected function createOrder()
    {
        $order = new Order;

        $product = new Product('Fallout 4', 59);
        $product2 = new Product('Pillowcase', 7);

        $order->add($product);
        $order->add($product2);

        return $order;
    }

}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Order extends Model
{

    protected $products = [];

    public function add(Product $product)
    {
        $this->products[] = $product;
    }

    public function products()
    {
        return $this->products;
    }

    public function total()
    {
        return array_reduce($this->products, function($carry, $product) {
            return $carry + $product->price();
        });
    }

}

No comments:

Post a Comment