api - 如何在 Laravel 中调用端点时模拟注入(inject) Controller 的对象?

标签 api laravel testing laravel-5 mocking

示例:

我有一个带有端点 /something/cool 的路由文件:

$router->get('/something/cool', [
    'uses' => 'MyController@myFunctionOne',
]);

我有一个名为 MyController 的 Controller 。 在 MyController 中,我有一个名为 myFunctionOne 的函数。 在 myFunctionOne 参数中,我有一个名为 MyService 的注入(inject)服务类。 MyService 具有调用外部 API callExternalApi() 的函数。

这是我的 Controller 的样子:

class MyController
{
   public function myFunctionOne(MyService $myService)
   {
       $myService->callExternalApi();

       // do some other things..
   }
}

在另一边我有一个功能测试:

class SomethingCoolTest extends TestCase
{
    public function testSomethingCool()
    {
         // callin my Route Endpoint (real http call to my app)
         $this->get('/something/cool', [])->response;

         // do some assertions..
    }
}

我的问题是:我如何模拟 Controller 注入(inject)服务,因为它正在调用外部服务?

最佳答案

这比我预期的要容易 :D

首先创建一个名为 mock 的模拟辅助函数:

public function mock($class)
{
    $mock = \Mockery::mock($class);

    $this->app->instance($class, $mock);

    return $mock;
}

然后模拟任何你喜欢的服务,如下:

   $mimo = $this->mock(MyService::class);

    $mimo->shouldReceive('callExternalApi')->once()->andReturn([
        "anything" => "cool"
    ]);

关于api - 如何在 Laravel 中调用端点时模拟注入(inject) Controller 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38316954/

相关文章:

api - 自定义播客提要的 SoundCloud mp3 链接和文件长度

ios - 无法从服务器 api 解析 JSON

laravel - 来自 Postman 的授权 header 在 Laravel 中不可见

html - 如何使用 laravel collective 5.2 以形式实现 css 类。 *

angular - 在 Angular Testing 中注入(inject)位置

angular - 类型错误 : providers[name][0] is not a function Angular 4. 0.1 npm 测试

ruby - 使用 ruby​​ 1.9.2、selenium-client 和 rspec(无rails)进行独立测试

javascript - 获得 Twitter 关注者和 Facebook 点赞

android 模拟器在 Retrofit CallBack 中崩溃

php - 如何在 Laravel 中自定义错误消息?