2009-11-06 6 views
16

私はいくつかのパブリックメソッドを公開する "Session"というクラスを持っています。私はユニットテストをしたいと思いますが、プロダクションでは "Session"オブジェクトのインスタンス化を制御する必要があります。そのため、SessionManagerクラスに構造を委譲し、Sessionのコンストラクタを内部にしました。ユニット内部コンストラクタを持つクラスをテストする

私は理想的には、セッションによって公開されているパブリックインターフェイスが期待どおりに動作することを証明するSessionManagerを作成するSessionManagerとは別に、Sessionクラスをテストしたいと思うのですが、使用せずにSessionからインスタンスを生成することはできません。私のテストを複雑にしたり、必要以上に役に立たないようにするSessionManager

これに対処する最も良い方法は何ですか?

乾杯、

レニー。

+0

pleseはを追加します。です内部コンストラクタを___or___で保護していますか? –

答えて

42

何も単純にInternalsVisibleTo属性を使用して、テストスイートにあなたのコードの内部が見えるように、テストの内部からあなたを妨げません:。。AssemblyInfoで、明確なアップ

[assembly:InternalsVisibleTo("TestSuiteAssembly")] 
+0

これはこれを行う最も簡単な方法だと思われますので、私はこれを実行します。ありがとう。 –

+1

答えは本当に完全ではありません。アセンブリを動作させるには、アセンブリに署名する必要があります。 – Santhos

+0

@Santhos実際にはない... –

2

ユニットテストクラスをSessionから継承させることができます(テストフレームワークでは、特定のクラスから継承する必要がないことを前提とします)。例えば、NUnitので:

var myInstance = Isolate.Fake.Instance<Session>(); 
// mock behavior here 
// do assertions here 

あなたはインスタンスを作成することができます。

[TestFixture] 
public class SessionTest : Session 
{ 
    public SessionTest() 
     : base() // call protected constructor 
    { 
    } 

    [Test] 
    public void TestSomething() 
    { 
    } 

} 
+1

OPはctorが内部で保護されていないことを示します。 –

+0

@Rex - 質問のタイトルは保護されていますが、質問自体は内部と言います。 –

1

あなたが嘲笑作成できるようになる、TypeMockのような製品を使用したい、このようなクラスのインスタンスを、(偽造) TypeMockの抽象クラスもレコードのために使用します。

+3

あなたがテストしたい同じクラスを嘲笑しても私には分かりません。あなたはクラスをテストするのではなく、クラスをテストするでしょうか? – Svish

+0

@Svish、あなたは間違った振る舞いは役に立ちませんが、実際のインスタンスを作成してアクセシビリティ問題を解決することもできます。Isolate.Fake.Instance (Members.CallOriginal)。このようにして、誰のコンストラクタにアクセスできないクラスの実際のインスタンスが作成されます。 免責事項 - 私はTypemockで働いています。 – Elisha

2

また、回避策として、Sessionから継承したTestSessionを作成して公開コンストラクタを公開することもできます。あなたのユニットテストの中で、あなたは基本的に元のセッションオブジェクトと同じことをするTestSessionを使用します。

public class TestSession : Session 
{ 

    public TestSession() : base() 
    { 

    } 

} 
1

セッションクラスコンストラクタをinternalにすることの価値については疑問に思うでしょう。

これは一般に、他の開発者があなたのクラスを使用するのを止めようとしていることを意味します。おそらく、この特定のアプリケーションの仕組みがどのように機能するのか、セッションマネージャーからセッションにアクセスする必要があるのはなぜですか?

+0

私は、クラスが一度に作成または破棄されることを強制するファクトリ・モデルで多くのことを行ってきましたが、他の人がそれを参照して使用することは許可されています。 –

+0

私はそれも多く見ました:)私はちょうどそれがどんな価値を追加するか見ていません。 Leonardが現在体験しているように、拡張またはテストしたいときに問題が発生します。 MSはこの点で最悪の犯罪者の1人ですが、ときどき使用するのに便利な内部クラスがありますが、アクセスできません。挫折! –

+5

APIのコンシューマであった人として、なぜMSが非常に多くのことを内部、保護などにしているのか不思議に思いました。今は主にAPI開発を行い、私のものは他の開発者によって消費されています。私は彼らが自分自身を内部で作ったはずのものを使って困ってしまうので、他の人の混乱を取り除くのに多くの時間を費やしています。時には、私たちが書いたすべてのコードの「適切な」使用を伝えることができると期待するのは現実的ではありません。 –

0

「保護された内部」コンストラクタを使用すると、テストが別のアセンブリにあると仮定すると、「テスト対象アセンブリ」にInternalsVisibleTo属性を追加できます。これは、あなたのテストはに-テストするアセンブリ」の内部のメンバーを見ることができるようになる。

更新 私はあなたのコンストラクタが保護されていたことを読んでいくつかの理由。とてもあなたがに良い位置にある、すでに内部にありますその属性を使用し

関連する問題