単体テストでAutoFixture.AutoMoqを使い始めたばかりで、特定の値を気にしないオブジェクトを作成するのに非常に役立ちます。結局のところ、匿名オブジェクトの作成がすべてです。
私が苦労しているのは、1 つ以上のコンストラクターのパラメーターを気にするときです。以下をご覧くださいExampleComponent
:
public class ExampleComponent
{
public ExampleComponent(IService service, string someValue)
{
}
}
特定の値を指定するテストを書きたいのですがsomeValue
、AutoFixture.AutoMoqIService
によって自動的に作成されます。
Freeze
コンポーネントに注入される既知の値を保持するために on myを使用する方法は知っていますが、独自の既知の値を提供IFixture
する方法がよくわかりません。
これが私が理想的にやりたいことです:
[TestMethod]
public void Create_ExampleComponent_With_Known_SomeValue()
{
// create a fixture that supports automocking
IFixture fixture = new Fixture().Customize(new AutoMoqCustomization());
// supply a known value for someValue (this method doesn't exist)
string knownValue = fixture.Freeze<string>("My known value");
// create an ExampleComponent with my known value injected
// but without bothering about the IService parameter
ExampleComponent component = this.fixture.Create<ExampleComponent>();
// exercise component knowning it has my known value injected
...
}
コンストラクターを直接呼び出すことでこれを実行できることはわかっていますが、これは匿名オブジェクトの作成ではなくなります。このようにAutoFixture.AutoMockを使用する方法はありますか、それとも DI コンテナーをテストに組み込む必要がありますか?
編集:
元の質問では抽象的である必要はなかったので、ここに私の具体的なシナリオを示します。
ICache
ジェネリックTryRead<T>
とWrite<T>
メソッドを持つインターフェースがあります:
public interface ICache
{
bool TryRead<T>(string key, out T value);
void Write<T>(string key, T value);
// other methods not shown...
}
CookieCache
オブジェクトを文字列との間で変換するwhereITypeConverter
ハンドルを実装してlifespan
おり、Cookie の有効期限を設定するために使用されます。
public class CookieCache : ICache
{
public CookieCache(ITypeConverter converter, TimeSpan lifespan)
{
// usual storing of parameters
}
public bool TryRead<T>(string key, out T result)
{
// read the cookie value as string and convert it to the target type
}
public void Write<T>(string key, T value)
{
// write the value to a cookie, converted to a string
// set the expiry date of the cookie using the lifespan
}
// other methods not shown...
}
そのため、Cookie の有効期限のテストを作成するときは、寿命は気にしますが、コンバーターについてはあまり気にしません。