第5章 PHPSpec でのスペックの記述

目次

5.1. スペック、サンプル、そしてコンテキスト
5.2. コードを書く前に、まずは要求される振る舞いを定義する
5.2.1. PHPSpec におけるスペックの配置
5.2.2. New Filesystem Logger の仕様を実装するコード
5.3. スペック用のドメイン特化言語 (DSL)
5.3.1. 実際の値 (Actual Value)
5.3.2. 期待する内容 (Expectation (Should or Should Not))
5.3.3. 条件 (Matcher)

5.1. スペック、サンプル、そしてコンテキスト

振舞駆動開発で使用する用語は、振る舞いを記述することを重視したものです。 これは、テスト駆動開発の用語が (多くのプログラマにとって直感的ではないために) 引き起こしていたさまざまな誤解を軽減させることでしょう。

スペック とサンプル のふたつの用語は、ほぼ同じ意味で使用しています。 「スペック」は、通常は単一の振る舞いを表します。これは "なにかをしなければならない (it should do something)" という単純な文で表すことができます。一方「サンプル」は、 PHPSpec のメソッド全体を表します。つまり「スペック」 を表すメソッドのコードのことです。たとえば以下の例でいうと、コードの中の $this->spec() で始まる行のことを「スペック」、 そしてそのスペックが満たす仕様を書いたパブリックメソッド全体のことを 「サンプル」と呼びます。

例 5.1. PHPSpec のサンプルメソッドで記述したスペック

public function itShouldHaveScoreOfZero()
{
    $bowling = new Bowling;
    $bowling->hit(0);
    $this->spec($bowling->score)->should->be(0);
}

さらに難しい概念が「コンテキスト」 です。要するにコンテキストとは、 振る舞いを定義する際に一般に使用する条件の集まりのことです。 上に示したボウリングの例では、 まずは新しいゲームを開始するところからはじめると仮定しています。 これは、そのクラスのすべてのスペックがが共有するコンテキストとなります。 今後、ゲームが終了した状態だとかゲームの途中の状態なども用意することになるでしょう。 さまざまなコンテキストを用意することで、 条件によって振る舞いがどのように変化するのかを探りやすくなります。