4

真剣にリファクタリングするのに十分な自信を持つために、危険なレガシーコードにテストを追加しています。問題の 1 つは、コードを書いた人が明らかにコードをテスト可能にしようとしなかったことです (単一の単体テストを書いたことがないことを考えると!)。

よくある問題は、現在インターフェイスがなく、11 レベルの深さの継承チェーンがあるだけであるということです。テスト中のクラスをその依存関係から分離するために Rhino モックを使用していますが、インターフェースではなくクラスをモックしているため、読み取り専用プロパティにvirtualキーワードがある場合にのみスタブできます。

私の現在の考えではvirtual、プロパティにキーワードを追加するだけです。既存の依存関係チェーンにさらにオブジェクトを追加する予定はなく、テストを作成できるようになります。

キーワードを追加することに反対する議論はありvirtualますか?それとも、テストを導入するためにこれは許容できる妥協点ですか?

サンプルコード...

テストクラスで:

var someClassStub = MockRepository.GenerateStub<SomeClass>();
someClassStub.Stub(s => s.SomeProperty).Return("Test");

いくつかのクラスで:

public virtual string SomeProperty {
    get {
        return someDependency.SomeMethod();
    }
}
4

2 に答える 2

1

追加に対する主な議論virtualは、それがあなたの意図を誤って伝えているということです. キーワードはvirtual、このプロパティがオーバーライドされる可能性があることを派生クラスに通知します。

は使用しませんvirtualが、次のように依存関係をモックします。

var mockedDependency = MockRepository.GenerateMock<IDependency>();
mockedDependency.Expect(x => x.SomeMethod())
                .Returns("whatever your test dictates");

var target = new SomeClass(mockedDependency);

mockedDependency.VerifyAllExpectations();

次に、次のように、新しく作成されたオーバーロードされたコンストラクターにそれを挿入します。

public SomeClass(IDependency dependency) : base()
{
    this.someDependency = dependency;
}
于 2013-04-05T17:33:52.517 に答える
0

どこにでも追加する代わりにvirtual、コードを最初にテスト可能にするためのより安全な方法がいくつかあります。個人的には、Visual Studio で提供されている "Extract Interface" ツールを使用して、具体的なクラス参照を可能な限り安全にインターフェイスに置き換えることを強くお勧めします。次に、具体的なクラスの代わりにインターフェイスをモックします。

Extract インターフェイスをサポートしていないバージョンの Visual Studio (またはその他の IDE) を使用している場合は、クラスのすべてのパブリック メンバーを追跡し、それらをインターフェイスに追加して具象クラスを作成するだけです。それを実装します。

最優先事項は、最初の一連のテストを取得することです。このようにして、コードが壊れていないという合理的な確信を持って、後でより危険な変更を加えることができます。

古いレガシー コードのユニット テストを可能にする作業を行っている人には、『Working Effectively With Legacy Code 』という本を読むことを強くお勧めします。それはお金の価値があります。私のマネージャーが相談するために私のオフィスのコピーを購入することになったほどです。

于 2013-04-05T17:44:25.387 に答える