Почему я не могу создать Mock в Laravel - PullRequest
0 голосов
/ 09 июля 2019

В последние дни я работаю над модульным тестированием в PHP Laravel. Я очень новичок в тестах, но я в общем читал о том, как они должны быть сделаны ... но на самом деле я не могу написать это правильно. Все еще есть некоторые ошибки. Вот мой класс (метод), который я хочу проверить (макет):

class ApiHelper
{
    private $model_locations;

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

    public function calcAllDistances(string $location)
    {
        $request_data = $this->validLatLong($location);
        if(!$request_data) {
            return null;
        }
        $user_lat = $request_data[0];
        $user_lng = $request_data[1];
        $all_locations = $this->model_locations::all()->toArray();
        $all_distances = [];

        foreach($all_locations as $single_location) {
            $point = new \stdClass;
            $point_lat = $single_location['lat'];
            $point_lng = $single_location['lng'];
            $distance = $this->calcDistance($user_lat,$user_lng,$point_lat,$point_lng);
            $point->name = $single_location['name'];
            $point->lat = $point_lat;
            $point->lng = $point_lng;
            $point->distance = $distance;
            array_push($all_distances,$point);
        }

        return $all_distances;
    }

Мы издеваемся calcAllDistances() метод.

Вот мой тестовый пример;

public function testCalcAllDistances()
{
    $double = Mockery::mock(Locations::class)->shouldReceive('all')->with('')->andReturn(5)->getMock();
    $this->app->instance('App\Locations', $double);
    $object_under_tests = new \App\Helpers\ApiHelper($double);

    $result = $object_under_tests->calcAllDistances('21.132312,21.132312');

    $expected_result = [2.3, 4.7, 8.9];

    $this->assertEquals($expected_result, $result);
}

И не смотря ни на что, я все еще получаю ошибки вроде:

1) Tests\Unit\ApiHelper::testCalcAllDistances
Mockery\Exception\BadMethodCallException: Static method Mockery_0_App_Locations::all() does not exist on this mock object

D:\xampp4\htdocs\api\api\app\Helpers\ApiHelper.php:26
D:\xampp4\htdocs\api\api\tests\Unit\ApiHelperTest.php:41

Caused by
Mockery\Exception\BadMethodCallException: Received Mockery_0_App_Locations::all(), but no expectations were specified

Клянусь своей душой, перепробовал все найденное в интернете .... но я все еще не могу написать тест. В принципе я хочу, чтобы метод Eloquent all () возвращал заданные мной значения, чтобы метод calcAllDistances () работал. Много пробовал, makePartial () и т. Д., Но ничего не помогло. Был бы очень благодарен за помощь

1 Ответ

1 голос
/ 09 июля 2019

Вы пытаетесь смоделировать статический метод, но код, который вы написали, вместо этого высмеивает публичный метод. Этот ответ содержит способ насмешки, который вы ищете.

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

...