在Laravel中,如何在测试时为服务容器提供另一个实现?

卢西奥·阿西斯(Lucio Assis)

我正在创建一个Laravel控制器,其中将随机字符串生成器接口注入其中一种方法。然后在AppServiceProvider中注册一个实现。这很好。

控制器使用随机字符串作为输入将数据保存到数据库。由于它是随机的,因此无法MakesHttpRequests像这样测试(使用):

$this->post('/api/v1/do_things', ['email' => $this->email])
->seeInDatabase('things', ['email' => $this->email, 'random' => 'abc123']);

因为我不知道使用实际的随机数生成器时将是什么“ abc123”。因此,我创建了Random接口的另一个实现,该实现始终返回“ abc123”,因此可以对此进行断言。

问题是:如何在测试时绑定到该假生成器?我试着做

$this->app->bind('Random', 'TestableRandom');

就在测试之前,但它仍然使用我在AppServiceProvider中注册的实际生成器。有任何想法吗?关于如何测试这样的事情,我是否完全走错了轨道?

谢谢!

擦洗

您有两种选择:

使用条件绑定实现:

class AppServiceProvider extends ServiceProvider {

    public function register() {
        if($this->app->runningUnitTests()) {
           $this->app->bind('Random', 'TestableRandom');
        } else {
           $this->app->bind('Random', 'RealRandom');
        }
    }
}

第二种选择是在测试中使用模拟

public function test_my_controller () {
    // Create a mock of the Random Interface
    $mock = Mockery::mock(RandomInterface::class);

    // Set our expectation for the methods that should be called
    // and what is supposed to be returned
    $mock->shouldReceive('someMethodName')->once()->andReturn('SomeNonRandomString');

    // Tell laravel to use our mock when someone tries to resolve
    // an instance of our interface
    $this->app->instance(RandomInterface::class, $mock);

    $this->post('/api/v1/do_things', ['email' => $this->email])
         ->seeInDatabase('things', [
             'email' => $this->email, 
             'random' => 'SomeNonRandomString',
         ]);
}

如果您决定采用模拟路线。确保检查嘲讽文档:

http://docs.mockery.io/en/latest/reference/expectations.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何防止同一服务中的另一个容器尝试打开Docker容器时打开?

如何在其他本地IP地址上为另一个站点提供服务?

如何在角度测试中向特定测试用例注入另一个服务

[Angular 7+]:如何在另一个服务规范中对服务进行单元测试?

如何在另一个服务中提供服务

Docker,如何在PHP中的另一个容器中获取容器IP?

如何在perl中运行多个测试脚本,从而提供另一个脚本的参数?

如何访问容器中的另一个容器

如何从另一个容器连接到服务?

当图像从 kubernetes 集群中的另一个微服务提供时,如何使用 next js 图像优化?

如何在构建另一个容器的过程中填充Mysql docker容器?

如何从dockerfile中访问在另一个Docker容器中运行的Web服务?

Rails Rspec - 如何测试服务是否已在另一个服务中调用

如何在传递REST查询时触发容器启动另一个容器并终止该容器?

如何在另一个服务提供商内致电服务提供商-angularjs2

当从另一个项目中提供api时,如何在Swashbuckle / Swaggerwork中创建url路径?

如何在另一个测试类中重用现有的JUnit测试?

如何在css中将一个容器放在另一个容器之上?

如何在颤抖中将一个容器夹在另一个容器上?

您如何测试在Go中调用另一个API端点的服务?

如何在运行测试时设置Maven以覆盖另一个设置文件?

JMeter 如何在另一个页面打开时测试页面加载性能

如何在 Laravel 测试中代表另一个会话发出 HTTP 请求?

如何在 Scala 中为具有一个或多个值的容器实现 ADT

如何在symfony 2.6中的另一个服务中使用服务

如何在另一个服务中从外部文件注入服务的模拟

如何从另一个容器中得到一个容器?

如何在容器(引导程序)中的另一个顶部显示一个 div?

如何在另一个内部使用服务?