gpt4 book ai didi

调用其他需要模拟的类方法的phpunit测试方法

转载 作者:IT王子 更新时间:2023-10-28 23:45:37 24 4
gpt4 key购买 nike

我正在尝试创建一个非常标准的单元测试,我在其中调用一个方法并断言它的响应,但是我正在测试的方法在同一个类中调用另一个方法,这会带来一些繁重的工作。

我想模拟一个方法,但仍按原样执行我正在测试的方法,仅使用从调用另一个方法返回的模拟值。

我已经简化了示例以使其尽可能简单。

class MyClass
{

// I want to test this method, but mock the handleValue method to always return a set value.

public function testMethod($arg)
{

$value = $arg->getValue();

$this->handleValue($value);

}


// This method needs to be mocked to always return a set value.

public function handleValue($value)
{

// Do a bunch of stuff...
$value += 20;

return $value;

}

}

我尝试编写测试。

class MyClassTest extends \PHPUnit_Framework_TestCase
{


public function testTheTestMethod()
{

// mock the object that is passed in as an arg
$arg = $this->getMockBuilder('SomeEntity')->getMock();
$arg->expects($this->any())
->method('getValue')
->will($this->returnValue(10));

// test handle document()
$myClass = new MyClass();

$result = $myClass->testMethod($arg);

// assert result is the correct
$this->assertEquals($result, 50);

}

}

我尝试过模拟 MyClass 对象,但是当我这样做并调用 testMethod 时,它总是返回 null。我需要一种方法来模拟一个方法,但保持对象的其余部分不变。

最佳答案

您可以模拟您正在测试的类并指定您想要模拟的方法。

$mock = $this->getMockBuilder('MyClass')
->setMethods(array('handleValue'))
->getMock();

$mock->expects($this->once())
->method('handleValue')
->will($this->returnValue(23)) //Whatever value you want to return

但是,IMO 这不是您测试的最佳想法。这样的测试将使重构变得更加困难。您正在指定类的实现,而不是类应该具有的行为。如果 handleValue 正在执行大量使测试变得困难的复杂工作,请考虑将逻辑移至单独的类中并将其注入(inject)到您的类中。然后您可以创建该类的模拟并将其传递给 testMethod。如果 handleValue 需要调整其行为,这样做会给您带来额外的优势,使 MyClass 更具可扩展性。

http://www.oodesign.com/strategy-pattern.html

作为一般规则,您不应该模拟您正在测试的系统。

关于调用其他需要模拟的类方法的phpunit测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com