0

私は嘲笑の問題を抱えています。パブリック メソッドのみをモックする必要があることはわかっています。しかし、プライベート メソッドがパブリック メソッドで呼び出され、このプライベート メソッドがファイルからデータを取得している場合はどうすればよいでしょうか。このプライベート メソッドをモックして、パブリック メソッドのテストを続行できるようにします。

テストを機能させるためにこれを公開することもできますが、それは理由により非公開であるため意味がありません。すべてを別のクラスに移動して、そこで関数をパブリックにすることもできますが、メイン クラス内のオブジェクトへの参照はどちらの方法でもプライベートにする必要があります。

Rhino Mocks を使用しています。

助けてくれてありがとう:)

4

5 に答える 5

3

ファイルの読み取りを行う機能をクラスに入れると、たとえば

FileReader : IFileReader

次に、IFileReader を引数としてコンストラクターに渡します。その後、それをモックできます

于 2009-06-24T10:30:17.410 に答える
0

ファイルの依存関係を引き出し、コンストラクターのIFileSomethingインターフェイスに渡します。次に、IFileSomethingをモックして、期待値を設定します。

于 2009-06-24T10:28:43.933 に答える
0

他の提案の代わりに、コードをテンプレート化して、クラスのメソッド全体で使用できるFileReaderタイプを受け取ることもできます。

template <class FileReader>
class SomeClass
{
  private: void doSomething()
  {
    FileReader fileReader;
    // Do something
  }
};

もう1つの方法は、FileReaderの実装を返すSomeClassコンストラクターにメソッドを渡すことです。これは、テンプレートの使用方法と同様にクラス全体で使用できますが、この方法で使用すると、IFileReaderからMockFileReaderを派生させることができます。

これらのいずれかの問題は、SomeClassからファイルリーダーにアクセスできないため、FileReaderで単体テストを実行できないことです。

nb上記のコードはC++ですが、どちらの方法もC#で実行できることはわかっています。

于 2009-06-24T12:23:48.957 に答える
0

これがサービスまたはビジネスエンティティであるかどうかに同意することを確認してください.

通常、サービスは一連のビジネス エンティティを使用して何らかのタスクを実行し、それ自体は永続的なデータを維持しないという点で認識されます。

ビジネス エンティティは、問題のドメイン内の単位であり、概念的に保持したいものです。

それがサービスであることがわかった場合は、サービスを構築するときに何らかの方法で依存関係を注入する必要があります。通常、次のようなコンストラクターを持つことができます: public MyService(IFileObject)

main から作成する場合: var service = new MyService(MyRealFile)

テスト セットアップから作成した場合: var service = new MyService(MyMockedFiled)

テストしているものが実際にビジネス エンティティであることがわかった場合は、エンティティに依存関係を与えないようにする必要があります。通常、これを行うには、一歩下がって、自分とビジネス エンティティの間に Service クラスを構築します。サービスは、必要なすべてのデータをビジネス エンティティに明示的に渡します。あなたの場合、これは、サービスが、ファイルを読み取ることによって学習するはずのものをエンティティに提供することを意味します。

したがって、サービスはファイル システムに依存するものであり、別の (専用の) ファイルリーダー ビジネス エンティティを使用してファイルを読み取ることさえあります。システム内の別の場所で使用する場合、ビジネス エンティティが不正な依存関係の呼び出しを行うことは決して望ましくありません。それらのコードはコンテキスト バウンドになります。これは回避したいことです。ビジネスエンティティは、高速で、個別で、明確で、応答性が高くなければなりません。

単体テストは、注入によって依存関係を受け取る可能性があるサービスに対して行う必要があります。ビジネス エンティティの単体テストを行っていることがわかった場合は、サービス レベルが不足しています。

于 2009-06-24T12:51:15.720 に答える