5

現在、 という抽象クラスの単体テストを作成中ですComponent。VS2008 は私のプログラムを問題なくコンパイルしたので、ソリューション内に単体テスト プロジェクトを作成することができました。しかし、私が気づいたことの 1 つは、テスト ファイルが作成されたときに、これまでに見たことのない次のメソッドがあることです。

internal virtual Component CreateComponent()
        {
            // TODO: Instantiate an appropriate concrete class.
            Component target = null;
            return target;
        }


internal virtual Component_Accessor CreateComponent_Accessor()
        {
            // TODO: Instantiate an appropriate concrete class.
            Component_Accessor target = null;
            return target;
        }

これらは具体的なComponentクラスを作成するためのものだと思います。

各 Test メソッド内には、次の行があります。

Component target = CreateComponent(); // TODO: Initialize to an appropriate value

これを適切な値に初期化するにはどうすればよいですか? または、上記のCreateComponentおよびCreateComponent_Accessorメソッドで説明したように、適切な具象クラスをインスタンス化するにはどうすればよいですか?

追加情報として、抽象クラスのコンストラクターを次に示します。

protected Component(eVtCompId inComponentId, eLayer inLayerId, IF_SystemMessageHandler inMessageHandler)

4

2 に答える 2

15

抽象クラスをインスタンス化することはできません。したがって、単体テスト プロジェクトでこの抽象クラス (抽象メンバーを実装する必要がある場所) のモック実装を作成し、テストしようとしているメソッドを呼び出すことができます。クラスのさまざまなメソッドをテストするために、さまざまなモック実装を持つことができます。

モック実装を作成する代わりに、Rhino Mocks、Moq、NSubstitute などのモック フレームワークを使用できます。これにより、このタスクが簡素化され、クラスの抽象メンバーの期待値を定義できるようになります。


アップデート:

コメント セクションで要求されたように、ここに例を示します。

単体テストする次の抽象クラスがあるとします。

public abstract class FooBar
{
    public abstract string Foo { get; }

    public string GetTheFoo()
    {
        return "Here's the foo " + Foo;
    }
}

これで、単体テスト プロジェクトで、抽象メンバーをモック値で実装する派生クラスを作成することで実装できます。

public class FooBarMock : FooBar
{
    public override string Foo 
    { 
        get { return "bar" } 
    }
}

GetTheFoo次に、メソッドに対して単体テストを作成できます。

// arrange
var sut = new FooBarMock();

// act
var actual = sut.GetTheFoo();

// assert
Assert.AreEqual("Here's the foo bar", actual);

モック フレームワーク (私の例では Moq) を使用すると、単体テストでこの抽象クラスを実装する必要はありませんが、モック フレームワークを直接使用して、テスト対象のメソッドが依存している抽象メンバーの期待値を定義できます。

// arrange
var sut = new Mock<FooBar>();
sut.Setup(x => x.Foo).Returns("bar");

// act
var actual = sut.Object.GetTheFoo();

// assert
Assert.AreEqual("Here's the foo bar", actual);
于 2013-03-04T08:10:43.533 に答える