PHP 测试框架:Shmock

jopen 10年前

Shmock(SHorthand for MOCKing)是 PHPUnit 创建 mocks 的平稳替代,使用 EasyMock 的 mock/replay 概念,但是又使用 mocking 定义的闭包范围。

示例代码:
<?php      namespace Foo;        /**     * Here's a class we're trying to test yay.     */      class Foo      {          private $foo = 0;          private $incrementing_service = null;            public function __construct(Incrementing_Service $incrementing_service)          {              $this->incrementing_service = $incrementing_service;          }            public function next_foo()          {              $this->foo = $this->incrementing_service->increment($this->foo);              return $this->foo;          }      }        /**     * Our test case runs the same test case twice - once with the original PHPUnit mocking     * syntax and a second time with Shmock syntax.     */      class Foo_Test extends PHPUnit_Framework_TestCase      {                  use \Shmock\Shmockers; // This enables the use of the Shmock helper methods (replicated below)                    public function test_phpunit_original_mocking_syntax()          {              // this is the original PHPUnit mock syntax                $incrementing_service_mock = $this->getMock('\Foo\Incrementing_Service', array('increment'));              $incrementing_service_mock->expects($this->once())                  ->method('increment')                  ->with($this->equalTo(0))                  ->will($this->returnValue(1));                $foo = new Foo($incrementing_service_mock);              $this->assertEquals(1, $foo->next_foo(0));          }            /**         * Create a shmock representation for $class_name and configure expected         * mock interaction with $conf_closure         * @return Shmock A fully configured mock object         * @note You do not need this protected method if you use the Shmockers trait, shown above         */          protected function shmock($class_name, $conf_closure)          {              return \Shmock\Shmock::create_class($this, $class_name, $conf_closure);          }            public function test_shmock_syntax()          {              // here's shmock. Neat huh?              $incrementing_service_mock = $this->shmock('\Foo\Incrementing_Service', function($shmock)              {                  $shmock->increment(0)->return_value(1);              });                $foo = new Foo($incrementing_service_mock);              $this->assertEquals(1, $foo->next_foo(0));          }      }

项目主页:http://www.open-open.com/lib/view/home/1398174438859