0

クラスを継承すると、クラスのテストが非常に簡単になることがわかりました。このseudoの例を考えてみましょう。

  public class Bizz
  {
    public void Do()
    {
      var obj = ExtenOutOfTest();
      someList.Add(obj);
    }

    protected List<ISomeObejct> someList = new ISomeObejct<ISomeObejct>();

    protected virtual ISomeObejct ExtenOutOfTest()
    {
     //return real obejct 
    }
  }

テストは次のようになります。

  [TestClass]
  public class BizzTest : Bizz
  {
    private ISomeObejct _fakedObj;

    protected override ISomeObejct ExtenOutOfTest()
    {
      return _fakedObj;
    }

    [TestMethod]
    public void Test_Do_Add()
    {
      _fakedObj = new Fake<ISomeObejct>().FakedObject; 

      Assert.IsFalse(someList.Any());
      base.Do(); //<-- target
      Assert.IsTrue(someList.Any());
    }
  }

これで、テストを分離することができ Bizzオブジェクトは、想定されている以外のメソッドを公開しません。

この方法でユニットテストを行うのは悪い習慣ですか?

IDisposableを実装するようにクラスを変更するとBizz、テストを実行できなくなります。

~Bizz(){Dispose(false);}

public void Dispose()
{
  Dispose(true);
}

private void Dispose(bool disposing)
{
  if(!disposing) return;
  //do cleanup resources
}

失敗したことを示す前に起動することさえありません: ユニットテストアダプターが例外をスローしました:あいまいな一致が見つかりました。

仮想化してからテストクラスでオーバーライドしようとしDisposeましたが、機能しませんでした。

どんな助けでも大歓迎です。

4

2 に答える 2

1

たとえば、 http://msdn.microsoft.com/en-us/library/fs2xkftw( v = vs.100 ).aspxで説明されているように、標準のdisposeパターンを使用すると、問題が修正されます。つまり、に置き換えprivate void Dispose(bool disposing)...ますprotected void Dispose(bool disposing)...

この問題は、MSTest(Visual Studio 2010および2013をテストした)が各テストの後にテストクラスでdisposeを呼び出すという事実に関連しています。この目的のために、MSTestはすべてのpublic void Dispose関数を照会しますが、残念ながら、2つのバリアントを区別する関数シグネチャの一部である引数を無視します。その結果、MSTestは。とともに存在しAmbiguous match foundます。

于 2014-07-09T09:14:22.953 に答える
0

失敗の理由はまだ私には謎です。しかし、これは修正されたようです:

void IDisposable.Dispose()
{
  GC.SuppressFinalize(this);
  Dispose(true);
}

private void Dispose(bool disposing)
{
   //actual cleanup omitted
}

インターフェイスが明示的に実装され、実際のクリーンアップ方法Dispose(bool disposing)が非公開になっていることに注意してください。

于 2013-02-21T14:03:53.617 に答える