冒着被火烧的危险……在上下文是隐式的上下文中,强制调用方法而不是函数有什么好处。

考虑到 PHP 的语法对于调用方法来说是如此丑陋,为什么 PHPUnit 的创建者要强制使用它呢?

如果框架设置了一个全局“currentTestCase”对象,然后透明地将失败的断言与该对象关联起来,我们可以编写:

assertEquals("blah", $text);

与等效但冗长的:

$this->assertEquals("blah", $text);

在这种情况下使用面向对象我们到底能得到什么。

请赐教。

有帮助吗?

解决方案

由于PHPUnit的选自衍生的xUnit而这的xUnit 如何做。

为什么xUnit的那样做?我很高兴你问。最初的原因,罗伯特指出,是xUnit的来自Smalltalk和Java中被JUnit的普及。两者都是OO有或全无的语言,使他们别无选择。

这并不是说不会有其他的优点。 OO测试可以继承。这意味着如果你想测试你可以运行所有家长的测试和刚刚覆盖的测试方法,你已经改变了行为的几个子类。这给你亚类的良好覆盖,而不必重复测试代码。

它容易添加并覆盖PHPUnit中assert方法。只要继承PHPUnit_Framework_TestCase,写自己的assert方法,让你的测试类从您的新的子类继承。你也可以写默认setupteardown方法。

最后,它保证了测试框架的方法不会与他们正在测试的东西发生冲突。如果测试框架,只是把它的功能集成到测试,你想测试的东西,有一个setup方法......好吧,你就有麻烦了。

这是说,我听你的痛苦。一个大的测试框架,可恼人而繁琐而脆。 Perl不使用的xUnit风格,它采用短测试功能名称的程序风格。请参见测试::更多一个例子。在幕后确实你的建议只是什么,有其所有功能使用一个单独的测试实例对象。还有用面向对象的测试方法模块调用测试::类混合程序断言功能,这确实两全其美的。

  

考虑到PHP的语法是如此丑陋用于调用方法

我猜你不喜欢->。我建议你学会适应它。 OO PHP是如此比选择更好。

其他提示

一个很好的理由是,作为assertXXX方法名称具有用于命名冲突的高风险。

另外一个是,它是衍生自的xUnit 家族,其典型地与面向对象的语言的价格 - 最初的Smalltalk。这使得它更容易从例如与自己的“兄弟姐妹” Java和Ruby。

不是直接答案,但从 PHPUnit 3.5 开始,您不必编写 $this-> 不再了。PHPUnit 3.5 添加了断言函数库,您必须包含它

require_once 'PHPUnit/Framework/Assert/Functions.php';

然后你可以做

assertEquals('foo', $bar);

请参阅 Sebastian Bergmann 的博客文章

具有测试用例类方法PHPUnit的保存工作。由于缺乏内置的智能PHPUnit的找不到或无法处理的纯测试功能。仅具有识别 - >断言*()消息-in一个简单的布尔链 - 再次节省了处理逻辑(PHPUnit的,而不是测试案例作者)。它的所有句法盐,从所述视的PHPUnit / SimpleTest的点的开销节约。

这不会是一个技术问题来捕捉错误/警告消息,异常或承认PHP的本地断言()语句。它没有这样做,因为一个困难的API看起来更加enterprisey。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top