0

コンストラクターがコンストラクターの関数を呼び出すクラスがあります。このクラスのモックを作成すると、コンストラクターから関数が呼び出されます。関数呼び出しをブロックしたい。私はそれを行うことができますか?

サンプルコード:

public class Foo
{
    public Foo()
    {
        Initialize();
    }

    private void Initialize()
    {
        //some code
    }
}

[TestFixture]
public class Test
{
    [Test]
    public void Test_Foo()
    {
        Foo foo = MockRepository.GenerateMock<Foo>(); 

        //some test
    }
}

ノート:

  1. のようなインターフェースを追加したくありませんFoo : IFoo
  2. 2 番目のコンストラクターを追加したくありません。
4

3 に答える 3

1

クラスをモックすると、クラスから継承するプロキシが作成されます (Rhino は Castle.DynamicProxy.DefaultProxyBuilder を使用します)。また、継承は C# のどこでもまったく同じように機能します。派生型のインスタンスを作成すると、基本型のすべてのコンストラクター (オブジェクトまで) が呼び出されます。

そのため、(Activator.CreateInstance(typeof(proxy)) を介して) プロキシのインスタンスが作成されると、Foo のコンストラクターも呼び出されます。これを避けることはできません。インターフェイスのモックを使用するか、初期化を無効にするパラメーターをコンストラクターに提供できます。

ところで、抽象クラスまたは具象クラスをモックすると、モックのすべての利点が失われます。テストは、モックされていないもの(コンストラクター、非仮想メソッド、およびデフォルトの実装) に依存するようになります。そして、SUT (テスト対象のシステム) は、もはや分離してテストされていません。壊れたテストは、抽象クラスまたは具象クラス内のいくつかの変更の結果である可能性があります。

于 2012-04-25T13:15:15.390 に答える
0

ブールフラグを追加する方法

ブールフラグ=false;

[テスト]

public void Test_Foo()
{
     if(flag == true)
     {
      Foo foo = MockRepository.GenerateMock<Foo>(); 

     }
    //some test
}
于 2012-04-25T09:34:09.057 に答える
0

一般に、インターフェイスまたは抽象クラスのモックのみを作成できます。

何をテストしますか?それがクラス Foo である場合、そのモックを作成することは完全に間違っています。

通常、セットアップが難しい、または実行に時間がかかる、テスト対象のクラスの依存関係のモックを作成します。このような依存関係の最も一般的な例は、リポジトリまたは Web サービスです。

于 2012-04-25T09:32:15.723 に答える