Laravel + Mockery InvalidCountException - PullRequest
       10

Laravel + Mockery InvalidCountException

0 голосов
/ 18 ноября 2018

Я пытаюсь смоделировать класс , чтобы он не вызывал apis сторонних производителей. Но при настройке макета это никак не влияет на действие контроллера. Я попытался заменить $this->postJson(), создав вручную экземпляры классов Request - и OEmbedController. create() -метод вызывается, но я получаю сообщение об ошибке от насмешки, что это не так.

Что я здесь не так делаю?

Ошибка:

Mockery \ Exception \ InvalidCountException: метод create () из Mockery_2_Embed_Embed должен вызываться ровно 1 раз, но вызываться 0 раз.

Тест:

class OEmbedTest extends TestCase
{
    public function tearDown()
    {
        Mockery::close();
    }

    /**
     * It can return an OEmbed object
     * @test
     */
    public function it_can_return_an_o_embed_object()
    {
        $url = 'https://www.youtube.com/watch?v=9hUIxyE2Ns8';

        Mockery::mock(Embed::class)
            ->shouldReceive('create')
            ->with($url)
            ->once();

        $response = $this->postJson(route('oembed', ['url' => $url]));
        $response->assertSuccessful();
    }
}

Контроллер:

public function __invoke(Request $request)
{
    $info = Embed::create($request->url);

    $providers = $info->getProviders();

    $oembed = $providers['oembed'];

    return response()
        ->json($oembed
            ->getBag()
            ->getAll());
}

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я смог решить эту проблему, используя это в своем тесте:

protected function setUp()
{
    parent::setUp();

    app()->instance(Embed::class, new FakeEmbed);
}

Затем разрешив это следующим образом

$embed = resolve(Embed::class);
$embed = $embed->create($url);
0 голосов
/ 18 ноября 2018

Кажется, вы издеваетесь над классом Embed неправильно.Если вы используете метод фасада Laravel shouldReceive() вместо создания самого макета самого класса, фреймворк поместит этот макет в служебный контейнер для вас:

Embed::shouldReceive('create')
    ->with($url)
    ->once();

вместо

Mockery::mock(Embed::class)
    ->shouldReceive('create')
    ->with($url)
    ->once();

Также имейте в виду, что если параметры, которые ваш проверенный код передает макету, отличаются от того, что вы изучили с помощью макета with($url), макет считается не вызванным.Но вы все равно получите другую ошибку при вызове не определенного метода.

...