1

私のプロジェクトはサイズと機能が拡大しているため、NUnit を使用していくつかの機能をテストすることにしましたが、私が直面している問題は、ほとんどのメソッドが静的であることです。ユニット テスト クラスからそれらを呼び出しますが、それらのパブリック メソッドは多くなり始めているので、メイン クラス内に新しいパブリック メソッドを作成するのではなく、インターフェイスを作成する必要があるのか​​ 、それとも静的メソッドをパブリックにしてインスタンス化する必要があるのか​​ 疑問に思いますクラス中級。

これは、私のプログラムがどのように構成されているかの例です。

namespace Mynamespace
{
    public class Foo
    {
         InsertUser();
         SortUser();
    }

    static void InsertUser()
    {

    }

    static void SortUser()
    {

    }

    //Here start the public methods to be called from the unit test class

    public DoSort() 
    {
        InsertUser();
        SortUser();
    }
}

プログラムのメインロジックとテストクラスを分離しておくための最良のアプローチは何ですか?

ありがとう、

4

2 に答える 2

1

静的メソッドを保持して非静的メソッドを追加する代わりに、すべてのメソッドを静的メソッドからインスタンス メソッドに変換し、Foo クラスのクライアントが依存する抽象化を抽出することをお勧めします。

public interface IFoo
{
     void InsertUser();
     void SortUser();
}

public class Foo : IFoo
{
     void InsertUser() { ... }
     void SortUser() { ... }
}

静的メンバーは、アプリケーションにカップリングを導入します。そして、静的メンバーをモックするのは本当に頭痛の種です。コードをテスト可能にし、疎結合にするために、実装するようにプログラミングするのではなく、抽象化するようにプログラミングする必要があります。コードが静的クラスではなくインターフェイスに依存している場合、この依存関係を簡単にモックできます。

Mock<IFoo> fooMock = new Mock<IFoo>();
fooMock.Setup(f => f.InsertUser()).Throws<InvalidOperationException>();

var sut = new ClassUnderTest(fooMock.Object);
fooMock.VerifyAll();

そして、これらのメソッドにグローバル スコープでアクセスする必要がある場合 (これはあまり良い考えではありません。プログラミングの手続き型スタイルです)、クラスをSingletonとして実装します。

public class Foo : IFoo
{
     public static Foo Instance = new Foo(); // simple singleton implementation
     private Foo() { }

     void InsertUser() { ... }
     void SortUser() { ... }
}

アプリケーションのどこでもクラスインスタンスを取得できます

IFoo foo = Foo.Instance;
foo.SortUser();
于 2013-07-23T16:41:33.577 に答える