2009-09-02 16 views
2

Rhino.Mocksでは、指定されたコンストラクタが呼び出されたかどうかを確認できますか?Rhino Mocks:コンストラクタが呼び出されたことを確認する方法

public interface IFoo 
{ 
    void Bar(); 
} 

public class FooFactory 
{ 

    public IFoo CreateInstance(int x, int y) 
    { 
    return new Foo(x, y); 
    } 

} 

public class Foo : IFoo 
{ 

    public Foo(int x, int y) 
    { 
    // ... blah 
    } 

    public void Bar() 
    { 
    // blah... 
    } 

} 

[TestFixture] 
public class FooFactoryTest 
{ 

    [Test] 
    public void Assert_Foo_Ctor_Called_By_Factory_CreateInstance() 
    { 

    MockRepository mocks = new MockRepository(); 

    using (mocks.Record()) 
    { 
     Expect.Call(/* ???? */); 
    } 

    using(mocks.Playback()) 
    { 
     new FooFactory().CreateInstance(1, 2); 
    } 

    mocks.VerifyAll(); 

    } 

} 

私がfoo(int型、int型)はFooFactoryによって呼び出されたことを確認したいと思います:

は、次のコードを考えてみましょう。

答えて

4

短答:いいえ、これはRhino Mock(または私が考えているどんなモックフレームワーク)でも動作しません。

回答が長くて:これは正しく実行されていません。ファクトリを使用するいくつかの理由の1つは、新しいオブジェクトが作成されたときに模倣することができるようにすることです。つまり、FooFactoryを嘲笑して他のオブジェクトのテスト用のモックを提供することになります。おそらく、あなたはテスト中に取得したいと思うあなたの工場内にたくさんのロジックを持っているでしょう - そのロジックを別のクラスに分けることを考えてください。

+0

合意。特定のコンストラクタが呼び出されたことをテストする必要があることに強く疑問を呈します。テストする必要があるのは、工場が特定の入力に基づいて期待される出力を生成することです。 –

2

私はあなたが求めていることをすることはできないと思います。

Foo(int, int)
はFooの上の唯一のコンストラクタである場合しかし、あなたは、単に複数のコンストラクタがある場合、あなたは返さいくつかの外部の状態を確認する必要があると思います

 
Assert.IsInstanceOfType(typeof(Foo), foo); 

つまり返さIFooオブジェクトの種類を主張することができますオブジェクト:

 
Foo f = (Foo)fooReturnedFromFactory; 
Assert.AreEqual(1, f.X); 
Assert.AreEqual(2, f.Y); 
0

コンストラクタが直接実行されたかどうかをテストすることはできません。

しかし、間接的にテストすることはできます。たとえば、プロパティ "A"を5に設定すると、プロパティ "A"の値をテストできます。

関連する問題