2009-10-26 5 views
16

私はMSMQを使用する私のアプリケーションをテストしますが、私はMessageQueueオブジェクトをモックするための方法が見つけられません。How-To MSMQ MessageQueueを擬似します

 var queuePath = @".\Private$\MyQueue"; 
     MessageQueue queue = null; 
     if (MessageQueue.Exists(queuePath)) 
     { 
      queue = new MessageQueue(queuePath); 
     } 
     else 
     { 
      queue = MessageQueue.Create(queuePath); 
     } 

私はxUnitでMoqを使用しています。

答えて

29

ここでの基本的な問題は、MessageQueueオブジェクトに強く依存していることです。一般的に私はこのような状況が発生すると、IQueueのようなインターフェイスを作成し、次にMessageQueueのIQueueの実装を作成します。

次に、MoqでIQueue依存関係を注入して、クラスが期待どおりに機能していることをテストできます。

public class DependentOnQueue 
{ 
    private IQueue queue; 
    //inject dependency 
    public DependentOnQueue(IQueue queue) 
    { 
     this.queue = queue; 
    } 

    public MessageQueue CreateQueue(string path) 
    { 
     //implement method that you want to test here 
    } 
} 

:このようなメッセージキューの何かに依存して、あなたのクラスに続いて

public MessageQueueImplementation : IQueue 
{ 
    public bool Exists(string path) 
    { 
     return MessageQueue.Exists(path); 
    } 

    public MessageQueue Create(string path) 
    { 
     return MessageQueue.Create(path); 
    } 
} 

:実装はこのようなものになるだろう

public interface IQueue 
{ 
    bool Exists(string path); 
    MessageQueue Create(string path); 
} 

:このような

何か今度は、メッセージに依存するこのクラスにmoqを使ってIQueueオブジェクトを挿入することができますキューオブジェクトと機能をテストします。

+2

word私のすべての.NETプロジェクトは、Microsoftの密閉されたすべてのクラス(FileInfo、HttpContextなど)のインタフェース/ラッパーになります。 – ryber

+3

+1。これはまた、最後の10日に受け入れられた答えです。「[クラスX]をどうやって模擬するのですか?質問。なぜ人々がこれを拾っていないのか分かりません。 –

+4

ラッパークラスは、そのメソッドのシグネチャが 'System.Messaging.MessageQueue'を返すため、' Create'メソッド(途中で静的になっているはずです)以外の解決策としてはうまくいくようです'IQueue'を実装してください。誰かがそれに対する回避策を思い付いていますか? –