簡體   English   中英

如何在功能測試中模擬Symfony 2服務?

[英]How to mock Symfony 2 service in a functional test?

我有symfony服務,它在某些方法中使用redis連接,但在所有方法中都沒有。

class ServiceA
{
    private $redis;

    public function __construct($redis)
    {
        $this->redis = $redis;
    }

    public function getRequest($param1, $param2)
    {
    $result = $param1+ $param2;
        return $request;
    }

    .. other methods which use $redis connection
}

我正在為僅使用getRequest方法的代碼編寫功能測試(此方法不需要redis連接)但是當構造函數將連接作為參數時,當我運行測試時它嘗試連接redis服務器。

如何編寫完全不使用redis連接的模擬服務並忽略原始構造函數。

我正在嘗試下面提到的方法,但沒有成功。 我仍然嘗試連接redis,盡管我已經禁用了原始構造函數。

http://blog.lyrixx.info/2013/04/12/symfony2-how-to-mock-services-during-functional-tests.html

$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

static::$kernel->getContainer()->set('my_bundle.service.a', $serviceA);

在創建ServiceA mock之后,您需要將它傳遞給客戶端的容器(而不是來自內核的容器,因為客戶端對象構建了自己的內核)。 嘗試這個:

$client = self::createClient();

$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

$client->getContainer()->set('my_bundle.service.a', $serviceA);

請注意,每次發出請求時都必須注入此模擬服務。 這是因為客戶端在每兩個請求之間重建內核。

你不應該模擬你的測試類,你應該模擬Redis類並注入它。

如果Redis未用於此測試,則甚至無需配置模擬。

$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock();
$serviceA = new ServiceA($redis);

有一個特殊的工具,可以處理模擬服務 - https://github.com/ramunasd/symfony-container-mocks

這很容易:

$service = static::$kernel->getContainer()->prophesize('my.custom.service');

你有沒有嘗試過 ?

$serviceA = $this->getMock('ServiceA', array('getRequest'), array(), '', false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM