【问题标题】:How do I test this class using phpunit?如何使用 phpunit 测试这个类?
【发布时间】:2015-10-31 20:04:25
【问题描述】:

我正在使用 Laravel 4.2 并尝试使用 phpunit 来测试我的代码,而不是手动测试所有内容。我读过 Jeffrey Way 的书 'Laravel 测试解码',但我仍然发现我的第一个测试很棘手。我要测试的课程如下。我正在努力解决的是 - 我应该测试什么?

我认为我不应该测试数据库或模型 $advert,因为它们应该有自己的测试。在这种情况下,我认为我需要模拟 $advert 或为其创建一个工厂,但我不知道是哪个。

任何指针将不胜感激。

EloquentListing.php

<?php

namespace PlaneSaleing\Repo\Listing;

use Illuminate\Database\Eloquent\Model;

class EloquentListing implements ListingInterface {

    protected $advert;

    public function __construct(Model $advert)
    {
        $this->advert = $advert;
    }

    /**
     * Get paginated listings
     *
     * @param int  Current page
     * @param int Number of listings per page
     * @return StdClass object with $items and $totalItems for pagination
     */
    public function byPage($page=1, $limit=10)
    {

        $result = new \StdClass;
        $result->page = $page;
        $result->limit = $limit;
        $result->totalItems = 0;
        $result->items = array();

        $listings = $this->advert
                         ->orderBy('created_at')
                         ->skip( $limit * ($page-1) )
                         ->take($limit)
                         ->get();

        // Create object to return data useful for pagination
        $result->items = $listings->all();
        $result->totalItems = $this->totalArticles;

        return data;

    }
    /**
     * Get total listing count
     *
     * 
     */
    protected function totalArticles()
    {

        return $this->advert->count();

    }

}

【问题讨论】:

    标签: php unit-testing laravel phpunit


    【解决方案1】:

    你必须测试你课堂上的每一个方法。您有构造函数,也应该对其进行测试,以查看它是否将模型设置为您的属性以及您的受保护方法。

    你应该用嘲讽来嘲笑你的模型。可以用

    安装

    $ composer require mockery/mockery

    然后在你的测试文件中:

    <?php
    
    use Mockery;
    use ReflectionClass;
    use PlaneSaleing\Repo\Listing\EloquentListing;
    
    class EloquentListingTest extends \TestCase
    {
    
        /**
         * Testing if __constructor is setting up property
         */
        public function testModelSetsUp()
        {
            $mock = Mockery::mock(Illuminate\Database\Eloquent\Model::class);
    
            $listing = new EloquentListing($mock);
    
            $reflection = new ReflectionClass($listing);
    
            // Making your attribute accessible
            $property = $reflection->getProperty('advert');
            $property->setAccessible(true);
    
            $this->assertInstanceOf(Illuminate\Database\Eloquent\Model::class, $property);
        }
    
        /**
         * Here you will check if your model is recieving calls
         */
        public function testByPage()
        {
           $mock = Mockery::mock(Illuminate\Database\Eloquent\Model::class);
    
           $mock->shouldReceive('orderBy')
                ->with('created_at')
                ->once()
                ->andReturn(Mockery::self())
                ->shouldReceive('skip')
                ->with(10)
                ->once()
                ->andReturn(Mockery::self())
                ->shouldReceive('take')
                ->with(10)
                ->andReturn(Mockery::self())
                ->shouldReceive('get')
                ->once()
                ->andReturn(Mockery::self())
                ->shouldReceive('all')
                ->once()
                ->andReturn(Mockery::self());
    
            $listing = new EloquentListing($mock);
        }
    
        /**
         * Here you will see, if your model is receiving call '->count()'
         */
        public function testTotalArticles()
        {
            $mock = Mockery::mock(Illuminate\Database\Eloquent\Model::class);
    
            $mock->shouldReceive('count')
                ->once()
                ->andReturn(Mockery::self());
    
            $listing = new EloquentListing($mock);
    
            // We will have to set method accesible
            $reflection = new ReflectionClass($listing);
    
            $method = $reflection->getMethod('totalArticles');
            $method->setAccessible(true);
    
            $listing->totalArticles();
        }
    
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2022-01-24
    • 2016-12-31
    • 1970-01-01
    • 2011-03-23
    • 2017-10-19
    相关资源
    最近更新 更多