首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Laravel/Lumen facade进行测试

用Laravel/Lumen facade进行测试
EN

Stack Overflow用户
提问于 2015-12-03 10:37:11
回答 1查看 2.3K关注 0票数 1

因此,我试图为使用facade的代码编写一个单元测试,如下所示:

代码语言:javascript
运行
复制
public function test() {
  MYFACADE::doSomething();
}

在单元测试中,我试图模拟正面调用:

代码语言:javascript
运行
复制
MYFACADE::shouldReceive('doSomething')
    ->once()
    ->andReturn(false);

唯一的问题是,当Laravel试图为MYFACADE创建一个底层类的实例时,它当然会运行构造函数,就在那里,是硬编码的数据库连接调用。因此,在不更改facade和从facade类的构造函数中删除数据库连接的情况下,是否可以在不运行facade构造函数的情况下模拟facade调用?

更新:设置的其余部分:

立面类

代码语言:javascript
运行
复制
class MyFacade extends Facade 
{
    protected static function getFacadeAccessor() 
    { 
        return 'myfacade'; 
    }
}

app.php

代码语言:javascript
运行
复制
$app->register(App\Providers\MyServiceProvider::class);
class_alias('App\Facades\MyFacade', 'MYFACADE');

服务提供者:

代码语言:javascript
运行
复制
class MyServiceProvider extends ServiceProvider
{

    public function register()
    {

        $this->app->bind('myfacade', function()
        {
            return new myClasThatDoesSomething();
        });
    }
}

facade使用的基础类。

代码语言:javascript
运行
复制
class myClasThatDoesSomething
{
   public function __construct()  
    {
       // opens db connection here  
    }

    public function doSomething()
    {

    }
}

使用facade的示例类:

代码语言:javascript
运行
复制
class TestClass 
{
   public function testMethod()
   {
       $returnValue = MYFACADE::doSomething();
       return $returnValue;
   }
}

单元测试,检查testMethod()是否返回'testValue';

代码语言:javascript
运行
复制
MYFACADE::shouldReceive('doSomething')
            ->once()
            ->andReturn('testValue');   

$instance = new TestClass();
$value = $instance->testMethod();
$this->assertEquals('testValue', $value);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 10:54:50

首先,Laravel文件读到:

外观为应用程序服务容器中可用的类提供了一个“静态”接口。

请确保您的MYFACADE遵循此模式。没有构造函数、数据库等的空间。如果您测试MYFACADE::doSomething(),您应该模拟该函数使用的所有其他类。

其次,下面的代码

代码语言:javascript
运行
复制
MYFACADE::shouldReceive('doSomething')
    ->once()
    ->andReturn(false);

模拟外观本身来测试使用 MYFACADE::doSomething()的其他东西。它应该返回Mockery的一个实例,只要在测试中调用MYFACADE::doSomething(),它就返回false

编辑:

Laravel的Facade模拟实现实例化了底层类,它允许使用瘦构造函数测试服务。虽然这是最佳做法,但未必总能做到。假设不能将DB连接逻辑从构造函数中移出,最好的方法是手动模拟服务:

代码语言:javascript
运行
复制
public function testTestMethod()
{
    MYFACADE::swap(\Mockery::mock()
        ->shouldReceive('doSomething')
        ->once()
        ->andReturn('testValue')
        ->getMock()
    );

    $instance = new \App\TestClass();
    $value = $instance->testMethod();
    $this->assertEquals('testValue', $value);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34063683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档