【问题标题】:PHPUnit test and abstract class with a method named 'Method'PHPUnit 测试和抽象类,带有一个名为“方法”的方法
【发布时间】:2016-02-10 03:44:05
【问题描述】:

我正在测试一个抽象类,它有一个名为Method 的方法。

这是我的抽象类(删节):

abstract class ClassToTest {

  function Method($_value = NULL) {
    // based on the value passed in a different value is returned.
  }
}

这是我的 PHPUnit 类:

class ClassToTestTest extends PHPUnit_Framework_TestCase {
  public $object = NULL;

  public function setUp() {
    $this->object = $this->getMockForAbstractClass('ClassToTest');
  }

  public function testMethod() {

    // passing no value should return NULL
    $this->assertNull($this->object->Method());

    // passing a value should return a value
    $this->assertEquals($this->object->Method($method), 'return_value');
  }
}

基于PHPUnit Documentation我应该可以使用

$stub->expects($this->any())->method('Method')->willReturn('foo');

不知何故,但我不知道如何使它工作。

如何使用 PHPUnit 测试名为 Method 的方法?

另外,我没有将方法重命名为其他名称的选项。

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

    您正在测试的课程肯定是您不应该嘲笑的唯一课程。如果你伪造它的方法调用,你就不会真正测试它。

    由于您的类是抽象的,您需要通过具体实现对其进行测试。如果您没有,请创建它以供测试。

    class MyClassToTest extends ClassToTest
    {
        // implement abstract methods
    }
    
    class ClassToTestTest extends PHPUnit_Framework_TestCase
    {
        private $object;
    
        protected function setUp()
        {
            $this->object = new MyClassToTest();
        }
    
        public function testMethod()
        {
            $this->assertSame('return_value', $this->object->Method('foo'));
        }
    

    }

    【讨论】:

    • 有一组类继承自这个抽象类,所以我可以用这种方式测试它,但是方法是在抽象类中声明和定义的,所以抽象类最有意义test 应该测试方法,而不是依赖继承的类来测试它。
    • 使用其中一种实现来测试抽象的。您可以拥有一个所有实现测试都将继承的通用测试用例类(因为它们都将共享此行为)。无论哪种方式,模拟测试类都不是办法。
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2019-06-29
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多