ObjcUnit その3

2003/05/25


ObjcUnitの使い方 その2

前回のつづきです。


テストを書こう その2

  1. isEqual:の修正
    やっとビルドできるようになりましたが、実行すれば、まだfailします(^_^)
    まずは、なんとか成功させるようにしましょう。テストでは、0と0を比較しているだけなので、いつもTRUEしか必要ありません。それじゃ、面倒なことは止めて、TRUEを返すようにしましょう(^^;
    TDDでは、こういうのを「Fake It」と言います。
    - (BOOL) isEqual: (id)another
    {
    	return TRUE;
    }
    
  2. テスト成功!
    これで、やっとテストが成功するようになりました。めでたし、めでたし。
  3. 0と1は違う!
    しかし、これじゃあ、どんなインスタンスを作って比較しても、いつも同じになっちゃいます(^^;
    違うのを比較して、ちゃんと失敗させましょう。
    [self assert:zero notEqual:[SmallInteger initWithInt:1]];
    
    なんて書きたいのですが、notEqual:なんてテストメソッドはありません(^^;
    [self assertFalse:[zero isEqual:[SmallInteger initWithInt:1]]];
    
    としましょう。これをビルドして、失敗させましょう。
  4. 値を持たせよう。
    メンバvalueを追加して、ここに値を保持させて、0と1を判別できるようにしましょう。
    @interface SmallInteger : NSObject {
    	int	value;
    }
    
  5. 値を設定しょう。
    初期化したとき、初期値から設定したメンバvalueに値を設定するようにしましょう。
    + (id) initWithInt: (int)initValue
    {
    	SmallInteger *newValue = [[[SmallInteger alloc] initWithInt:initValue] autorelease];
    	return newValue;
    }
    
    - (id) initWithInt: (int)initValue
    {
    	value = initValue;
    	return self;
    }
    
  6. 値を比較しょう。
    まだfailしていますね。予定どおりです(^_^)
    せっかく値を設定しても参照しなければ、設定しないのといっしょです。ちゃんと比較しましょう。
    - (BOOL) isEqual: (id)another
    {
    	if (value == [another intValue]) {
    		return TRUE;
    	} else {
    		return FALSE;
    	}
    }
    
    ほかのインスタンスのメンバには触れませんので、メソッドintValueを使ってアクセスします。
    - (int) intValue
    {
    	return value;
    }
    
    やりました。とうとう成功です。

次は、加算してみましょう。

- (void) testAdd
{
	SmallInteger* one = [SmallInteger initWithInt:1];
	SmallInteger* two = [one add:[SmallInteger initWithInt:1]];
	[self assert:two equals:[SmallInteger initWithInt:2]];
}

まずは、コンパイルエラーです。つづきは、また今度。


今日のおまけ

メソッドisEqual:の引数の型は、id型です。このメソッドの中で、メソッドintValueを呼び出すときに、idというクラスがintValueというメソッドを持っているわけじゃありません。まして、自分のメソッドとして呼び出しているわけでもありません。
C++しか知らないと、こういうところが理解しにくいかもしれませんね。


戻る