From a8281d9fb07dc6bf5c5c3f1042e92a7b7527b987 Mon Sep 17 00:00:00 2001 From: Ellipsis <914598200@qq.com> Date: Sat, 9 Nov 2019 10:38:24 +0800 Subject: [PATCH] Added how to use mock in testing. (#902) --- doc/zh/testing.md | 199 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) diff --git a/doc/zh/testing.md b/doc/zh/testing.md index 6b3e0246c7..7a1305710a 100644 --- a/doc/zh/testing.md +++ b/doc/zh/testing.md @@ -201,3 +201,202 @@ class UserTest extends HttpTestCase ``` composer test -- --filter=testUserDaoFirst ``` + +## 测试替身 + +Gerard Meszaros 在 Meszaros2007 中介绍了测试替身的概念: + +有时候对被测系统(SUT)进行测试是很困难的,因为它依赖于其他无法在测试环境中使用的组件。这有可能是因为这些组件不可用,它们不会返回测试所需要的结果,或者执行它们会有不良副作用。在其他情况下,我们的测试策略要求对被测系统的内部行为有更多控制或更多可见性。 + +如果在编写测试时无法使用(或选择不使用)实际的依赖组件(DOC),可以用测试替身来代替。测试替身不需要和真正的依赖组件有完全一样的的行为方式;他只需要提供和真正的组件同样的 API 即可,这样被测系统就会以为它是真正的组件! + +下面展示分别通过构造函数注入依赖、通过inject注释注入依赖的测试替身 + +### 构造函数注入依赖的测试替身 + +``` +demoApi = $demoApi; + } + + public function test() + { + $result = $this->demoApi->test(); + + return $result; + } +} + +``` + +``` + 1 + ]; + } +} + +``` + +``` +getContainer()->get(DemoLogic::class)->test(); + + $this->assertEquals(1, $res['status']); + } + + /** + * @return Container + */ + protected function getContainer() + { + $container = Mockery::mock(Container::class); + + $apiStub = $this->createMock(DemoApi::class); + + $apiStub->method('test')->willReturn([ + 'status' => 1, + ]); + + $container->shouldReceive('get')->with(DemoLogic::class)->andReturn(new DemoLogic($apiStub)); + + return $container; + } +} + +``` + +### 通过inject注释注入依赖的测试替身 + +``` +demoApi->test(); + + return $result; + } +} +``` + +``` + 1 + ]; + } +} + +``` + +``` +getContainer(); + + $res = $this->getContainer()->get(DemoLogic::class)->test(); + + $this->assertEquals(11, $res['status']); + } + + /** + * @return Container + */ + protected function getContainer() + { + $container = ApplicationContext::getContainer(); + + $apiStub = $this->createMock(DemoApi::class); + + $apiStub->method('test')->willReturn([ + 'status' => 11 + ]); + + $container->getDefinitionSource()->addDefinition(DemoApi::class, function () use ($apiStub) { + return $apiStub; + }); + + return $container; + } +} + +```