假设我想替换从数据库获取数据库的对象中的方法,该数据库具有预先填充数据的数据库。我该怎么做?
根据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
答案 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));
}
}
您的测试会模拟您尝试测试的确切类,这可能是一个错误,因为某些方法可能会在模拟过程中被覆盖。