隔離框架(Isolation Framework)——以 Codeception 為例

定義:一個隔離框架是一套可用來幫助寫程式的 API,使用這套 API 來建立假物件比手刻假物件要容易得多、快得多、簡潔許多。它是一個可以在 runtime 建立和設定假物件的 library,這些假物件稱為 dynamic stub 或 dynamic mock。

之所以稱為隔離框架,是因為這些框架幫你隔離工作 unit 跟它的 dependency object。

使用隔離框架的好處是讓隔離框架幫我們生 stub 跟 mock object,省去手刻的麻煩。

動態產生假物件

動態假物件是在 runtime 才建立的 stub 或 mock object,它的建立不需要手刻假物件的 code(寫死在假 class 中)。

Codeception

可以用 Codeception Stub github 來製造假的 stub 跟 mock object。寫起來大概會長這樣:

1
2
3
4
5
6
7
8
9
10
11
12
public function testFoo()
{
$foo = new Foo;
$this->assertEquals(1, $foo->bar());
$this->assertEquals(2, $foo->hasArg(1));
$this->assertEquals(5566, $foo->noFake());

$fooStub = Stub::make('Foo', ['bar' => 2, 'hasArg'> 3]);
$this->assertEquals(2, $fooStub->bar());
$this->assertEquals(3, $fooStub->hasArg(1));
$this->assertEquals(5566, $fooStub->noFake());
}
Foo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Foo {
public function bar() {
return 1;
}

public function hasArg($ha) {
return 2;
}

public function noFake()
{
return 5566;
}
}

除了 Stub::make() 之外還有 Stub::makeEmpty()。class name 可以是 interface。要小心不要把 Stub 當作 extract and override 在寫……

可以配合 Codeception\Stub\Expected 做 mock object。如果是 mock object,Stub::make() 系列要記得傳最後一個參數 testCase,不然像 Expected::once() 會沒 verify 到。

這可以省去寫一堆 ‘’class FakeXXX’’,但是針對 API json 或 xml response 還是只能手動把這些 json 跟 xml 存下來去做假物件。