2017-12-15 7 views
1

CustomizeとRegisterの機能的な違いについて説明してください。以下のTestCustomizeの例は失敗し、TestRegisterが合格します。カスタマイズスクリプトが正常に動作することが期待されました。それは英語で私に英語で読む: "HttpClientを生成するときは、speciminを提供する前にそれに後処理ラムダを使用する"。Fixture.Customize vs Fixture.Register

しかし、私が得るのは、AutoFixtureによって明確に生成されたguidを持つhttpアドレスです。

[Fact] 
public void TestCustomize() 
{ 
    var fixture = new Fixture(); 
    fixture.Customize<HttpClient>(c => 
    { 
     //c.OmitAutoProperties(); makes no difference 
     c.Do(x => x.BaseAddress = new Uri("http://myval")); 
     return c; 
    }); 
    var client = fixture.Create<HttpClient>(); 
    Assert.Equal("http://myval/", client.BaseAddress.ToString()); 
} 

[Fact] 
public void TestRegister() 
{ 
    var fixture = new Fixture(); 
    fixture.Register(() => new HttpClient 
    { 
     BaseAddress = new Uri("http://myval") 
    }); 
    var client = fixture.Create<HttpClient>(); 
    Assert.Equal("http://myval/", client.BaseAddress.ToString()); 
} 
+1

[、最小完全、かつ検証例]を投稿してください(https://stackoverflow.com/help/mcve)問題を再現すること。 –

+0

@ MarkSeemann私はそのようにする時間を見つけた後、問題を修正しました。うまくいけば、私がここで紛失している概念を特定し、少し助けてくれることができます。 – cocogorilla

答えて

1

これはCustomizeRegisterとは何の関係もありません。実際、source code for Registerを見ると、Customizeより便利な方法に過ぎないことがわかります。

問題は、Doの使用にあります。メソッドが値を返すこと

IPostprocessComposer<T> Do(Action<T> action) 

注意:Doの署名を見れば、あなたはそれがこのタイプを持っていることがわかります。ファンクションスタイルまたはCommand-Query Separationに従う場合、メソッドは定義されているインスタンスを変更せず、変更された動作を持つ新しいオブジェクトを返します。

c.Do(x => x.BaseAddress = new Uri("http://myval")); 

1はすぐに変更された行動で、戻り値を破棄:1の書き込み

F#やHaskellのような言語では、関数呼び出しの戻り値を無視すると言っているようなコードを書くと、コンパイル時の通知を受け取ることになりますが、C#はそれをしません。

いずれの場合でも、AutoFixtureのAPIはfluent interfacesとして設計されています。その意図は、あなたがこの方法を一緒に呼び出しを連結していることである:

fixture.Customize<HttpClient>(c => c 
    .Without(x => x.BaseAddress) 
    .Do(x => x.BaseAddress = new Uri("http://myval"))); 

あなたはまだそうでない場合、BaseAddressが自動で上書きされますので、デフォルトの自動プロパティの動作をオフにするWithout(または、あなたがする場合は、OmitAutoProperties)が必要ですプロパティー機能。

試験のこのバージョンでは、通過:

[Fact] 
public void TestCustomize() 
{ 
    var fixture = new Fixture(); 
    fixture.Customize<HttpClient>(c => c 
     .Without(x => x.BaseAddress) 
     .Do(x => x.BaseAddress = new Uri("http://myval"))); 

    var client = fixture.Create<HttpClient>(); 

    Assert.Equal("http://myval/", client.BaseAddress.ToString()); 
}