レジストリエントリやファイルの読み取り/書き込み/作成のための単体テストを書く場合、私は実際のレジストリとファイルシステムを使用すべきではないが、レジストリとファイルシステムの模倣
C#デスクトップ/ WPFスタイルのアプリケーションでこれらを嘲笑するために推奨するフレームワークは何ですか? このトピックを読むのに適した入門書はありますか?
レジストリエントリやファイルの読み取り/書き込み/作成のための単体テストを書く場合、私は実際のレジストリとファイルシステムを使用すべきではないが、レジストリとファイルシステムの模倣
C#デスクトップ/ WPFスタイルのアプリケーションでこれらを嘲笑するために推奨するフレームワークは何ですか? このトピックを読むのに適した入門書はありますか?
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();
}
ここでは、クラスがインターフェイスで正しいメソッドを呼び出し、正しい値を渡したと主張しています。
「Registry」や「File」のような静的なクラスを非難するのは簡単ではありません。 TypeMock。あなたがテストしているコードを変更できるならば、適切なインターフェース、 'IRegistryXXX'、' IFileXXX'を実装しているクラスで実際のレジストリとファイルアクセスをラップすることを検討してください。そうすればインターフェースをモックでき、あなたは適切な時に適切なコールをしています。 – stuartd
@stuardt簡単な例があるでしょうか。私はこれに新しいです、私が従うかわからない。とても有難い。 – pixel
問題ありません、回答を参照してください – stuartd