2012-02-25 46 views
9

我在想如果我可以验证'class'是否有函数。 assertClassHasAttribute不起作用,这是正常的,因为函数不是属性。HowTo PHPUnit assertFunction

+2

你为什么要测试? – Gordon 2012-02-25 23:34:33

+0

当我做一些重构时非常有用...必须通过测试知道我的类包含的方法有助于在某些原因需要将方法转移到另一个类中时:如解耦响应等。 – HexaGridBrain 2012-02-26 02:35:55

+0

我会争论当你确定依赖关系被正确地模拟/存根,并且你完全覆盖了你的公共API时,你永远不需要这个。 – Gordon 2012-02-26 10:51:53

回答

32

当有不PHPUnit的我提供了一个断言方法可以创建或使用较低级别的断言一个带有详细信息:

$this->assertTrue(
    method_exists($myClass, 'myFunction'), 
    'Class does not have method myFunction' 
); 

assertTrue()是基本的,你可以得到。它允许很大的灵活性,因为您可以使用任何内置的php函数返回测试的bool值。因此,当测试失败时,错误/失败消息根本没有帮助。类似Failed asserting that <FALSE> is TRUE。这就是为什么将第二个参数传递给assertTrue()以说明测试失败的原因。

7

单元和集成测试用于测试行为,不用于重申 类定义。

所以PHPUnit不提供这样的断言。 的PHPUnit可以断言,一个类可以有名称X,该函数返回值的财产以后,但你可以做你想做使用的是什么:

/** 
* Assert that a class has a method 
* 
* @param string $class name of the class 
* @param string $method name of the searched method 
* @throws ReflectionException if $class don't exist 
* @throws PHPUnit_Framework_ExpectationFailedException if a method isn't found 
*/ 
function assertMethodExist($class, $method) { 
    $oReflectionClass = new ReflectionClass($class); 
    assertThat("method exist", true, $oReflectionClass->hasMethod($method)); 
} 
+0

真棒。这听起来非常适合我的需求。谢谢@MounaCheikhna – shan 2015-06-27 18:43:36