2011-08-02 8 views
4

ファクトリメソッドのユニットテストに関する質問があります。 次のコードがあり、Foo.ToBarメソッドをテストしたいとします。ユニットテストの方法は?

class Bar 
{ 
    public Bar(int someparam) 
    { 
    } 
} 

class Foo 
{ 
    int m_someprivate; 

    public Foo() 
    { 
     m_someprivate = 1; 
    } 

    public Bar TooBar() 
    { 
     return new Bar(m_someprivate); 
    } 
} 

私は2つの異なる方法を見ました。そのうちの1つはそのようなものになります

[Test] 
void TooBarTest() 
{ 
    Foo foo = new Foo(); 

    Bar result = foo.TooBar(); 

    Assert.AreEqual(new Bar(1), result); 
} 

これは非常に単純です。しかし、私は2つの理由でそれを好きではありません

a)Fooクラスをテストしている間、私たちはバークラスの不注意なテストの一部です。例として、Barコンストラクタがスローされた場合は、 Fooクラスは正常ですので、テストは失敗します。これは間違っています。それは問題があるBarクラスです。

b)私はその生産コードがAssert new Bar(1)で使用されているとは思いません。むしろいくつかの外部状態(etc)に応じて異なる結果を返す例として、 がいくつかのコードよりも定数を使うことを好むでしょう。

私はそれがより良い方法だように見えバー

class Bar 
{ 
    public Bar(int someparam) 
    { 
    } 
} 

interface IBarFactory 
{ 
    Bar create(int someparam); 
} 

class BarFactory : IBarFactory 
{ 
    public Bar create(int someparam) 
    { 
     return new Bar(someparam); 
    } 
} 

class Foo 
{ 
    int m_someprivate; 
    BarFactory m_barFactory; 

    public Foo() 
    { 
     m_someprivate = 1; 
     m_barFactory = new BarFactory(); 
    } 

    public Bar TooBar() 
    { 
     return m_barFactory.create(m_someprivate); 
    } 

    public void setBarFactory(BarFactory barFactory) 
    { 
     m_barFactory = barFactory; 
    } 
} 


[Test] 
void TooBarTest() 
{ 
    Mockery mockery = new Mockery() 
    IBarFactory barFactoryMock = mockery.NewMock<IBarFactory>(); 
    Expect.Once.On(barFactoryMock).Method("create").With(new Object[] { 1 }).Will(Return.Value(new Bar(1)); 

    Foo foo = new Foo(); 
    foo.setBarFactory(barFactoryMock); 

    foo.ToBar(); 
} 

を作成するスタンドアロン工場の創造に基づいており、見た他の方法。しかし、私は、1行のコードをテストするだけで、ファクトリインターフェイス、工場、工場セッタを作成してテストを複雑にする必要があるのは嫌です。

あなたの考えは?あなたは何を好むか?それをテストする他の方法はありますか?

+0

可能な複製[具体的なクラスを戻り値の型として持つユニットテストファクトリメソッド](http://stackoverflow.com/questions/1061552/unit-testing-factory-methods-which-have-a-concrete-戻り値クラスとしてのクラス) – BrokenGlass

答えて

3

私はTomas Janssonと交渉する。さらに、私はBarFactoryをインスタンス化するのではなく、コンストラクタにIBarFactoryを挿入します。バーやBarFactoryに触れる必要はありません。代わりに、テスト時にIBarFactoryをスタブするだけで済みます。

3

私は間違いなくスタンドアロンファクトリメソッドに行きます。また、メソッドの名前をToBarから別のものに変更します。

関連する問題