这试图为一个类的方法编写一个测试,该方法使用闭包调用mock方法.你如何验证被关闭的封锁?
我知道你可以断言参数是Closure的一个实例.但是你会怎么检查关闭的内容?
例如,如何验证传递的函数:
class SUT { public function foo($bar) { $someFunction = function() { echo "I am an anonymous function"; }; $bar->baz($someFunction); } } class SUTTest extends PHPUnit_Framework_TestCase { public function testFoo() { $mockBar = $this->getMockBuilder('Bar') ->setMethods(array('baz')) ->getMock(); $mockBar->expects($this->once()) ->method('baz') ->with( /** WHAT WOULD I ASSERT HERE? **/); $sut = new SUT(); $sut->foo($mockBar); } }
你的问题是你不注意你的依赖(关闭),这总是使得单元测试变得更加困难,并且可以使隔离成为可能.
将封装插入到SUT :: foo()中,而不是在其中创建它,您会发现测试更容易.
这是我如何设计方法(记住我对于你的真实代码一无所知,所以这可能或可能不实用):
class SUT { public function foo($bar,$someFunction) { $bar->baz($someFunction); } } class SUTTest extends PHPUnit_Framework_TestCase { public function testFoo() { $someFunction = function() {}; $mockBar = $this->getMockBuilder('Bar') ->setMethods(array('baz')) ->getMock(); $mockBar->expects($this->once()) ->method('baz') ->with($someFunction); $sut = new SUT(); $sut->foo($mockBar,$someFunction); } }