Как смоделировать метод модели, которая просматривает один или несколько экземпляров другой модели с помощью PhpUnit? - PullRequest
2 голосов
/ 20 июня 2019

Я делаю юнит-тесты на разных откликах дорог (обычно дороги защищены аутентификацией).Мне удалось издеваться над аутентификацией пользователя.Однако я не могу смутить метод моих моделей, который обращается к базе данных, потому что у меня есть ошибки подключения к базе данных.

Знаете ли вы, как издеваться над его методами, не вызывая его в базу данных?

вот что я сделал.

  • Контроллер
    class XYZController extends Controller{

    ...
        public function index(Request $request){
            $user   = Auth::user();
            $person = $user->person()->first(); // how mock the method person - from the I have the database error.
            $phone  = $user->phone()->first();// how mock the method phone
            $prefix = $phone->country()->first()->code; // how mock the method country
            $email  = $user->email;
            $pays   = Pays::where('xyz', false)->get(); // how mock the method person
    ...
            return view('xyz',[
                ...
            ]);
        }
    ...
    }
  • Тест
    class XYZTest extends TestCase{

        public function testRouteMain(){
          $user = factory(User::class)->make();
          $person = factory(Person::class)->make();

          $this->withoutMiddleware();
          $this->be($user);

          $mockUser = Mockery::mock(User::class);

          $mockUser->shouldReceive('person')->andReturn(collect());
          $mockUser->shouldReceive('first')->andReturn($person);
          $this->app->instance(User::class, $mockUser);
          $reponse = $this->get(route('xyz_route'));

          $this->assertEquals(Response::HTTP_OK, $reponse->>getStatusCode(), 'The status code expected is '.Response::HTTP_OK);// I put the doubles ">>" on purpose , it's to avoid having the blockquote
       }
    }

1 Ответ

0 голосов
/ 20 июня 2019

Попробуйте это:

$mockUser = Mockery::mock(User::class);
$this->app->instance(User::class, $mockUser);
          ^^^^^^^^^^

Кроме того, если я не ошибаюсь:

$mockUser->shouldReceive('person')->andReturn(collect());
$mockUser->shouldReceive('first')->andReturn($person);

Повторите для каждого из вызванных методов.

...