php – 测试覆盖特征方法执行
我有这样的情况.我有一些第三方特征(我不想测试)我有我的特性使用这个特性,在某些情况下运行第三方特质方法(在下面的例子中我总是运行它).
当我有这样的代码: use Mockery; use PHPUnitFrameworkTestCase; class SampleTest extends TestCase { /** @test */ public function it_runs_parent_method_alternative() { $class = Mockery::mock(B::class)->makePartial(); $class->shouldReceive('fooX')->once(); $this->assertSame('bar',$class->foo()); } protected function tearDown() { Mockery::close(); } } trait X { function foo() { $this->something->complex3rdpartyStuff(); } } trait Y2 { function foo() { $this->fooX(); return 'bar'; } } class B { use Y2,X { Y2::foo insteadof X; X::foo as fooX; } } 它会工作正常,但我不希望代码组织这样.在类I的上面的代码中使用两个特征,但在代码中我想测试其实特征使用开头提到的其他特征. 但是当我有这样的代码时: <?php use Mockery; use PHPUnitFrameworkTestCase; class SampleTest extends TestCase { /** @test */ public function it_runs_parent_method() { $class = Mockery::mock(A::class)->makePartial(); $class->shouldReceive('fooX')->once(); $this->assertSame('bar',$class->foo()); } protected function tearDown() { Mockery::close(); } } trait X { function foo() { $this->something->complex3rdpartyStuff(); } } trait Y { use X { foo as fooX; } function foo() { $this->fooX(); return 'bar'; } } class A { use Y; } 我越来越:
所以看来Mockery在这种情况下不再嘲笑X :: foo方法了.是否有办法使用这样组织的代码编写这样的测试?
到目前为止,无法模拟更深层次的别名方法.您可以使用本地方法代理别名方法调用,并允许模拟受保护的方法.
检查下面的代码 use Mockery; use PHPUnitFrameworkTestCase; class SampleTest extends TestCase { /** @test */ public function it_runs_parent_method() { $mock = Mockery::mock(A::class)->shouldAllowMockingProtectedMethods()->makePartial(); $mock->shouldReceive('proxyTraitCall')->once(); $this->assertSame('bar',$mock->foo()); } protected function tearDown() { Mockery::close(); } } trait X { function foo() { $this->something->complex3rdpartyStuff(); } } trait Y { use X { foo as fooX; } function foo() { $this->proxyTraitCall(); return 'bar'; } function proxyTraitCall() { return $this->fooX(); } } 如果你自动加载特性,你可以尝试使用Mockery来overload. /** @test */ public function it_runs_parent_method() { $trait = Mockery::mock("overload:" . X::class); $trait->shouldReceive('foo')->once(); $class = Mockery::mock(A::class)->makePartial(); $this->assertSame('bar',$class->foo()); } Don’t test implementation details.测试它就像你使用它. 类用户必须只知道使用它的公共接口,为什么测试应该有所不同? 来自Dave Thomas和Andy Hunt的语用单元测试
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |