如何用phpunit替换方法

时间:2014-11-04 14:34:42

标签: php mocking phpunit

假设我想替换从数据库获取数据库的对象中的方法,该数据库具有预先填充数据的数据库。我该怎么做?

根据https://phpunit.de/manual/current/en/test-doubles.html ...

  

可以在Mock Builder对象上调用setMethods(array $ methods)   指定要用可配置测试替换的方法   双。其他方法的行为不会改变。如果你打电话   setMethods(NULL),则不会替换任何方法。

大。所以告诉phpunit我想要替换哪些方法,但是我在哪里告诉它我用它替换它们?

我找到了这个例子:

protected function createSSHMock()
{
    return $this->getMockBuilder('Net_SSH2')
        ->disableOriginalConstructor()
        ->setMethods(array('__destruct'))
        ->getMock();
}

很好 - 所以__destruct方法正在被替换。但它被取代的是什么?我不知道。以下是其中的来源:

https://github.com/phpseclib/phpseclib/blob/master/tests/Unit/Net/SSH2Test.php

1 个答案:

答案 0 :(得分:7)

使用一种不做任何事情的方法,但您可以在以后配置其行为。虽然我不确定你是否完全理解嘲讽是如何运作的。 你不应该嘲笑你正在测试的类,你应该模拟被测试的类所依赖的对象。例如:

// class I want to test
class TaxCalculator
{
    public function calculateSalesTax(Product $product)
    {
        $price = $product->getPrice();
        return $price / 5; // whatever calculation
    }
}

// class I need to mock for testing purposes
class Product
{
    public function getPrice()   
    {
        // connect to the database, read the product and return the price
    }
}

// test
class TaxCalculatorTest extends \PHPUnit_Framework_TestCase
{
    public function testCalculateSalesTax()
    {
        // since I want to test the logic inside the calculateSalesTax method
        // I mock a product and configure the methods to return some predefined
        // values that will allow me to check that everything is okay
        $mock = $this->getMock('Product');
        $mock->method('getPrice')
             ->willReturn(10);

        $taxCalculator = new TaxCalculator();

        $this->assertEquals(2, $taxCalculator->calculateSalesTax($mock));
    }
}

您的测试会模拟您尝试测试的确切类,这可能是一个错误,因为某些方法可能会在模拟过程中被覆盖。