2016-07-19 16 views
2

Aは、参照されるdllのクラスであるため、変更することはできません。それは私のDoFoo()メソッドの中で呼び出されるメソッドFoo()を持っています(パラメータとしてAを取る)。高価で既にテストされているので、DoFoo()Foo()を実行しないでテストしたいと思っています。"sealed"クラスの実装を置き換えます

このような状況ではどうすればよいですか?この上

私の考え:

  • A周りのラッパークラスを作成し、DoFoo()にそれを渡します。ラッパークラスは、実際の実装と偽の実装を区別します。
  • 拡張メソッドを使用して同じことができます。
  • dynamicを使用し、空のクラスDoFoo()を実装してください。

答えて

4

公開するメソッドを含むインターフェイスを作成します。

このインターフェイスを実装し、外部アセンブリのクラスを使用して作業を行うラッパークラスを作成します。モック実装のように、このインタフェースの他の実装を作成することができます。

たとえば、コンストラクタインジェクションを使用するインターフェイスを、機能が必要なクラスに注入します。

あなたのテストでは、外部ライブラリを使用する実装をあなたの模擬実装と簡単に置き換えることができます。

+0

のためのインターフェースは何ですか?実際の方法に行くか、何もしないだけのラッパークラスで十分でしょうか?私が逃した利点はありますか? –

+0

依存関係を減らすためのインタフェースベースのプログラミング。実際のインプリメンテーションはコンストラクタインジェクションを介して注入だから、私はインターフェイスを使用することをお勧めします。 –

1

実際にはTypemockでそれを行うのは簡単ですが、ラッパーやインターフェイスを作成する必要はありません。ただ模擬するだけです。たとえば:

テスト対象のメソッド:

public string DoFoo(A a) 
    { 
     string result = a.Foo(); 
     return result; 
    } 
} 

sealed public class A 
{ 
    public string Foo() 
    { 
     throw new NotImplementedException(); 
    } 
} 

がテスト:

[TestMethod,Isolated] 
public void TestMethod1() 
{ 
    var a = Isolate.Fake.Instance<A>(Members.CallOriginal); 

    Isolate.WhenCalled(() => a.Foo()).WillReturn("TestWorked"); 

    var classUnderTest = new Class1(); 
    var result = classUnderTest.DoFoo(a); 

    Assert.AreEqual("TestWorked", result); 
} 
+0

リンクが壊れています。http://www.typemock.com/の代わりにhttp://www.typemCOk.com/を指しています。 – Roman

+1

ローマにはありがとうございました。 – JamesR

+0

いいね、私は彼らがこれをやる方法に興味があるだろう。しかし私は商業的な解決策をとるとは思わない。 –

関連する問題