2016-04-09 9 views
0

メンバGetValue()が定義されていなくても、FakeItEasyは0を返します。私の質問は、なぜ0の値が未定義のメンバー呼び出しから返され、例外はスローされません。定義されていないメンバーを呼び出すための例外をスローすることは、いいえではないことを指示する、一般的な偽装/偽装/スタブリングフレームワークソフトウェアパターンがありますか?例外をスローしないフレームをモックする理由は何ですか

public interface IThing 
{ 
    int GetValue(); 
} 

public class Thing: IThing 
{ 
    public int GetValue() 
    { 
     return 1000; 
    } 
} 

    [TestMethod] 
    public void Test1() 
    { 
     var thing= A.Fake<IThing>(); 
     // A.CallTo(() => thing.GetValue()).Returns(1); 
     var val = thing.GetValue(); // Not defined but returns 0 rather than throwing an exeption 
     Assert.AreEqual(1, val); 
    } 
+0

'VARの事= A.Fake は();'これは、偽のIThingオブジェクト(ある偽のオブジェクトを作成しますIThing、Thingオブジェクトではない)。 0はintのデフォルト値になります(何も返さないように指定していないので)。私は一般的に例外の動作についてはわかりませんが、すべてが有効なのでこのケースではスローされません。 – Tone

+0

@Toneこれは私が求めていることではありません。ランタイム例外は、.NETランタイムで未定義メンバーを厳密に型指定されているものとして呼び出すときの予想される動作です。私の疑問は、Mockingフレームワークがより緩やかな意味を持つ理由です。 –

答えて

2

これは主に意見をベースと質問され、おそらく閉じられます。しかし、ここにいくつかの情報があります。 最初に、一部のフレームワークはデフォルトでは厳格であり、一部のフレームワークではより緩やかなセマンティクスが可能です。 FakeItEasyは後者に向いています。この選択肢に与えられる理由はしばしば、そのようなスタイルは、脆弱なテストをサポートします。なぜなら、ユーザは、「重要でない」ものが変更されたときに、擬似オブジェクト(またはモックなど、あなたが呼ぶもの)あなたのテストは「理由なし」に壊れません。

厳しいセマンティクスを好む人もいるし、そうでない人もいます。あなたは厳格な行動をしたい場合、あなたはstrict fakes

var thing= A.Fake<IThing>(options => options.Strict()); 

を使用してFakeItEasyでそれを得ることができるとFakeItEasy 2.0.0-rc1に、あなたはオプションを実装することで、グローバルにこの動作を有効にするimplicit creation optionsを使用することができ

注意このようなビルダー:あなたはラインであなたの偽物を定義している

class MakeEverythingStrictOptionsBuilder : IFakeOptionsBuilder 
{ 
    public bool CanBuildOptionsForFakeOfType(Type type) 
    { 
     return true; 
    } 

    public void BuildOptions(Type typeOfFake, IFakeOptions options) 
    { 
     options.Strict(); 
    } 

    public Priority Priority 
    { 
     get { return Priority.Default; } 
    } 
} 
関連する問題