2017-03-14 20 views
1

レジストリエントリやファイルの読み取り/書き込み/作成のための単体テストを書く場合、私は実際のレジストリとファイルシステムを使用すべきではないが、レジストリとファイルシステムの模倣

C#デスクトップ/ WPFスタイルのアプリケーションでこれらを嘲笑するために推奨するフレームワークは何ですか? このトピックを読むのに適した入門書はありますか?

+2

「Registry」や「File」のような静的なクラスを非難するのは簡単ではありません。 TypeMock。あなたがテストしているコードを変更できるならば、適切なインターフェース、 'IRegistryXXX'、' IFileXXX'を実装しているクラスで実際のレジストリとファイルアクセスをラップすることを検討してください。そうすればインターフェースをモックでき、あなたは適切な時に適切なコールをしています。 – stuartd

+0

@stuardt簡単な例があるでしょうか。私はこれに新しいです、私が従うかわからない。とても有難い。 – pixel

+0

問題ありません、回答を参照してください – stuartd

答えて

2

OKです。

を考えると、これらのクラス:

public interface IRegistryActions 
{ 
    bool WriteValue(string key, string value); 
} 

public class RegistryActions : IRegistryActions 
{ 
    public bool WriteValue(string key, string value) 
    { 
     // pseudocode 
     // var key = Registry.OpenKey(key); 
     // Registry.WriteValue(key, value); 
    } 
} 

し、それらを使用して、このクラス:アクションを実行するクラスは、この例では、コンストラクタに渡されますが、同じように簡単財産である可能性があります。つまり、実際のコードでクラスを実際に使用する場合は、IRegistryActionsを実装するクラスをパラメータとして明示的に渡すことができます。 var exampleClass = new ExampleClass(new RegistryActions()); - または代わりにnullを渡された場合、実際の実装をデフォルト、つまりthis.registryActions = registryActions ?? new RegistryActions();

public class ExampleClass 
{ 
    private IRegistryActions registryActions; 

    public ExampleClass(IRegistryActions registryActions) 
    { 
      this.registryActions = registryActions; 
    } 

    public bool WriteValue(string key, string value) 
    { 
      return registryActions.WriteValue(key, value); 
    } 
} 

は、だからあなたのユニットテストであなたは、コールが正しいパラメータで作られていることを確認します。どのように正確にこれを行うかは、あなたが使っているフレームをどのようにしているかによって決まります。一般に個人的な選択の問題か、すでに使用されているものを使用します。

[Test] 
public void Test_Registry_Writes_Correct_Values() 
{ 
    string key = "foo"; 
    string value = "bar"; 

    // you would normally do this next bit in the Setup method or test class constructor rather than in the test itself 
    Mock<IRegistryActions> mock = MockFramework.CreateMock<IRegistryActions>(); 

    var classToTest = new ExampleClass(mock); // some frameworks make you pass mock.Object 

    // Tell the mock what you expect to happen to it 
    mock.Expect(m => m.WriteValue(key, value)); 

    // Call the action: 
    classToTest.WriteValue(key, value); 

    // Check the mock to make sure it happened: 
    mock.VerifyAll(); 
} 

ここでは、クラスがインターフェイスで正しいメソッドを呼び出し、正しい値を渡したと主張しています。

+0

それは、それを明確にする、ありがとう。どのモックフレームワークをお勧めしますか? – pixel

+1

私は個人的にはお勧めできませんでした。私が好きなものはそれ以上維持されていません。他のみんなが好きなものは好きではありません。 – stuartd

+0

大きな助けをいただき、ありがとうStuardt私はさらに調査を行い、RhinoMockで上記の提案を組み合わせて使用​​しました。非常に感謝して〜 – pixel

関連する問題