2016-10-05 2 views
0

DBクエリをラップするクラスがたくさんあります。私は、各クエリをテスト実行し、その結果を確認し、自分のクラスのプライベートメンバーに返すことができるようにしたい。心に浮かぶおそらく野蛮な考え方は、[Fact]属性を持つXUnitに表示されるpublic SelfTest()メソッドをクエリラッパーに与えることでした。したがって、私のテストメソッドは、クラスの内部へのアクセスを持ち、DB要求の結果を詳細に検証することができます。SelfTest()メソッドを使ってプライベートメンバーをテストする

私が知っておくべき不幸な結果はありますか?私は自分のDBラッパークラスにパブリックメソッドを追加していますが、このメソッドはダメージを受けません。 XUnitでは私のアプリケーションを別のプロジェクトでテストするのではなく、直接「消耗品」にしていますが、これは無害です。

+0

クエリメソッドを内部として宣言し、それらをアセンブリプロジェクトのinternalsVisibleTo-Attributeを介してテストプロジェクトからアクセスできるようにすることはどうしてですか(https://msdn.microsoft.com/de-de/library/system.runtime)。 (v = vs.110).aspx)? –

+1

良いチップありがとう。全体の話をするには、[私のラッパークラスが生成されます](https://visualstudiogallery.msdn.microsoft.com/eaf390af-afc1-4994-a442-ec95923dafcb)。生成されたクラスに安全にSelfTest()メソッドを含めることができれば、コード生成のために別の場所を管理する必要がなくなり、人生ははるかに簡単になります。トラップはありません。 – bbsimonbb

答えて

2

実動コードにSelfTest()メソッドを追加することは、機能に直接影響しません。しかし、これは種類が の「babaric」というあなたの考えは、クリーンコードとして知られているいくつかの原則の違反によって引き起こされます。

  • このすべての最初のシングルResponsibilty原則に違反することになります。ただ、いくつかのポイントが名前を付ける

    。機能自体のほかに、クラスは自分自身をテストする責任があります。

  • さらに多くのコードと複雑さがクラスに追加されています。誰かがその機能を理解するのが面白い場合、誰がテストコードを読みたいのですか?
  • 生産コード(この場合はXUnit)に依存関係を追加すると、アセンブリは出荷される製品の一部になります。

しかし、代替アプローチは何ですか?

テストのためにすべてのメソッドとプロパティをpublicにするだけでは適切ではありません。しかし、assembly.csのInternalsVisibleToアノテーションを使用すると、テストプロジェクトアセンブリに、テストするアセンブリの内部メソッドとプロパティにアクセスする権利を与えることができます。

例:

内部の方法を用いることができるMyAssembly.UnitTestsに

[assembly:InternalsVisibleTo("MyAssembly.UnitTests")] 

そしてMyAssemblyラインのassembly.csに加えます。

+0

私はそれらのポイントを取る。しかし、InternalsVisibleToはプライベートメンバーを社内に昇進させることを義務付けています。 – bbsimonbb

+0

[それでした: - )](https://marketplace.visualstudio.com/items?itemName=bbsimonbb.QueryFirst) – bbsimonbb

関連する問題