5

usingステートメントでインスタンス化された使い捨てオブジェクトをモックする方法がないため、ユニットテストとusingステートメントが実際に連携できるかどうか疑問に思っています。次のusingステートメントを含むメソッドを効果的に単体テストするにはどうすればよいですか?

public void MyMethod()
{{
   using(MyDisposableClass disp = new MyDisposableClass())
   {{
       ..。
   }
}

ユニットテストをしているときにステートメントを使用することは単に禁止されていますか?

コメントをいただければ幸いです。

4

4 に答える 4

4

いいえ、ステートメントの使用は確かに禁止されていません。しかし、MyDisposableClassは実際に何をしますか?これは、実際にはusingステートメントが問題であるという問題ではなく、モックしたい新しいオブジェクトを作成するメソッドの問題であることに気づきます。それが問題です。

本当にMyDisposableClassをモックする必要がありますか?内部で作成する代わりに、MyMethodに渡すことはできますか?いつものように、秘訣は、プロセスにフックして、必要なときに独自のオブジェクトを注入する方法を見つけることです...

于 2008-12-11T10:28:15.893 に答える
3

リソースクラスをモックしたいので、すでに持っていると思います

interface IResource : IDisposable
{
        void DoSomething();
}

class DisposableResource : IResource
{
    public void Dispose()       {  Console.WriteLine("That's it. I'm outta here!");  }
    public void  DoSomething()  {  Console.WriteLine("Hard work this");  }
}

obj を注入できるようにするには、シームが必要です。つまり、GetResource()

class MyClass
{
    protected virtual IResource GetResource()
    {
        return new DisposableResource();
    }
    public void MyMethod1()
    {
        using (IResource r = GetResource())
        {
            r.DoSomething();
        }
    }
}

テスト コードでは、単純にサブクラス化して GetResource() をオーバーライドし、モックを返します。

class MySubClassForTest : MyClass
{
    protected override IResource GetResource()
    {
        return new MockResource();
    }
}
class MockResource : IResource    // or use a mock framework to create one
{
    public void  DoSomething()        { Console.WriteLine("Me work?"); }
    public void  Dispose()            { Console.WriteLine("Disposed Mock!"); }
}

それでおしまい。

 MyClass obj = new MyClass();           // production code
 obj.MyMethod1();

 obj = new MySubClassForTest();         // test code
 obj.MyMethod1();
于 2008-12-11T11:10:05.030 に答える
1

ファクトリパターン依存性注入パターンを使用すると、独自のリソースをインスタンス化する単体テストメソッドの方法が大幅に簡素化されます。

これは主題に関する良い読み物です:

于 2008-12-11T10:42:37.690 に答える
1

TypeMock を使用すると、これをモックできます。オンザフライで IL を変更することで機能するため、他の方法ではモックできないものを問題なくモックできます。

しかし、TypeMock を使用したとしても、Jon Skeet と Pop Catalin が上で述べていることを確認する必要があります。依存関係の数を減らそうとすると、コードの保守が容易になります。

于 2008-12-11T11:14:59.247 に答える