2016-04-28 5 views
2

フェイクしたクラスに挿入された偽のオブジェクトを取得する方法はありますか?FakeItEasy - フェイクしたオブジェクトを取得する

など。

私は次のインターフェイス+クラスを持っているとしましょう。

[TestFixture] 
public class SomeClassTests 
{ 
    [Test] 
    public void FakeCall_CallsIFakeabl_FakeYou() 
    { 
     var subject = A.Fake<SomeClass>(); 

     subject.FakeCall(); 

     A.CallTo(() => A.Fake<IFakeable>().FakeYou()).MustHaveHappened(); 
    } 
} 

が、これはSomeClass._fakeフィールドをさらすことなく可能です:

public interface IFakeable 
{ 
    void FakeYou(); 
} 

public class SomeClass 
{ 
    private readonly IFakeable _fake; 

    public SomeClass(IFakeable fake) 
    { 
     _fake = fake; 
    } 

    public void FakeCall() 
    { 
     _fake.FakeYou(); 
    } 
} 

とは、次のようなものをテストしたいですか?

Fakeにシングルトンを使用するよう指定できますか?

答えて

3

テストの対象がSomeClassの場合、なぜそれを偽造していますか?あなたが...実際のクラスではなく、偽物をテストしたいので、おそらくこれを行う必要があります。

[Test] 
public void FakeCall_CallsIFakeabl_FakeYou() 
{ 
    var fake = A.Fake<IFakeable>(); 
    var subject = new SomeClass(fake); 

    subject.FakeCall(); 

    A.CallTo(() => fake.FakeYou()).MustHaveHappened(); 
} 

また、あなたはFakeItEasyのfixture initialization featureを使用することができます。

[TestFixture] 
public class SomeClassTests 
{ 
    [Fake] public IFakeable Fake {get;set;} 

    [UnderTest] public SomeClass Subject {get;set;} 

    [SetUp] 
    public void Setup() 
    { 
     Fake.InitializeFixture(this); 
    } 

    [Test] 
    public void FakeCall_CallsIFakeabl_FakeYou() 
    { 
     Subject.FakeCall(); 

     A.CallTo(() => Fake.FakeYou()).MustHaveHappened(); 
    } 
} 
+0

まさに私が探していたもの!!!! –

1

なぜここで重要なのは、プライベートフィールドで呼び出されるメソッドをテストするためです。プライベートフィールドはクラスにカプセル化されているため、メソッドがそのフィールドで行うことは「クラスの内部」を構成し、テストには関係ありません。 FakeYou()実装にはテストが必要な重要な副作用があると私は推測します。その場合は、FakeCallが起こったことをテストするのではなく、subject.FakeCall()に続いてその副作用をテストします。

代わりに、公共の場であることを_fakeを変更することができ、および変更:

A.CallTo(() => A.Fake<IFakeable>().FakeYou()).MustHaveHappened(); 

に:

A.CallTo(() => subject._fake.FakeYou()).MustHaveHappened(); 

これがある場合は、 "偽" と "_fakeを" 名前を変更したい場合がありますReSharperがあなたに伝えるように、C#の慣習の場合です。

+0

私が尋ねる理由は、しばしばので、たとえば、SaveChanges()がEFコンテキストで呼び出されたことを確認したいと思います。私はMoqのために作成したもの(Moqqer)と同じFakeItEasyAutoMockerを見つけました。だからボックスの外にこれをサポートしていないと思います。 –

関連する問題