2011-09-09 12 views
3
[Subject(typeof(OnceADayProcessor))] 
public class When_processing_process_twice 
{ 
    private static ICanBeProcessedOnceADay ProcessedOnceADay; 

    private Establish context =() => { OnceADayProcessor.Now =() => new DateTime(2011, 1, 1, 0, 0, 0, 0); }; 

    private Because of =() => 
          { 
           ProcessedOnceADay = MockRepository.GenerateMock<ICanBeProcessedOnceADay>(); 
           ProcessedOnceADay.Process(); 
           ProcessedOnceADay.Process(); 
          }; 

    private It should_execute =() => ProcessedOnceADay.AssertWasCalled(x => x.Expect(p => p.Process())); 
    private It should_execute_only_once =() => ProcessedOnceADay.AssertWasNotCalled(x => x.Expect(p => p.Process())); 
} 

編集したソリューション:メソッドが1回だけ呼び出されることをどのようにアサーションするのですか?

[Subject(typeof(OnceADayProcessor))] 
public class When_processing_a_process_twice_at_the_same_day 
{ 
    static ICanBeProcessedOnceADay canBeProcessedOnceADay; 

    Establish context =() => 
    { 
     canBeProcessedOnceADay = A.Fake<ICanBeProcessedOnceADay>(); 
    }; 

    Because of =() => 
    { 
     OnceADayProcessor.Process(canBeProcessedOnceADay); 
     OnceADayProcessor.Process(canBeProcessedOnceADay); 
    }; 

    It should_execute_only_once =() => 
     A.CallTo(() => canBeProcessedOnceADay.Process()).MustHaveHappened(Repeated.Exactly.Once); 
} 

答えて

4
var mock = MockRepository.GenerateMock<ICanBeProcessedOnceADay>(); 
mock.Expect(a => a.Process()).Repeat.Times(1); 
... 
mock.VerifyAllExpectations(); 
+2

これは、メソッドが_少なくとも1回、_exactly_は1回だけ呼び出されることを検証します。 –

4

私はItstub.AssertWasCalled(x => x.Process(), o => o.Repeat.Once())stub.Expect()stub.VerifyAllExpectations()への呼び出しを置き換えます。スタブに対して複数の期待がある場合は、それぞれのアサーションを1つのItに入れ、互いに独立して失敗(または成功)させることができます。

スタブの作成は、Establishになります(基本的に、依存関係の作成とテスト中のシステムはユニットテストの「配置」フェーズの一部です)。

GenerateMockでもGenerateStubを使用しないと、Expectで指定されたメソッド以外のメソッドを呼び出すとモックが脆弱なテストにつながる可能性があります。 FakeItEasyのような図書館は、一般に、よりよく発見可能なAPIを提供し、学習しやすくなり、「成功のピット」に陥ります。

+0

私はなぜモックの代わりにスタブを使うべきか理解していません。私はコールと状態を主張するので、私はモックが必要だと思った。 – Rookian

+0

http://ayende.com/wiki/Rhino+Mocks+3.5.ashx#stubsandmocksの間の相違 モックはテストを中断しますが、スタブはテストを中断します。それは簡単です。 –

3

あなたがメソッドを一度のみと呼ばれていることを確認したい場合は、厳格なモックを必要とする:

var mock = MockRepository.GenerateStrictMock<IShouldOnlyBeCalledOnce>(); 
mock.Expect(a => a.Process()).Repeat.Once(); 

sut.Process(mock) 

mock.VerifyAllExpectations(); 

あなただけGenerateMockを使用している場合、それは「少なくとも」のチェックを行います。これはRepeats.Times(x)にも適用されます。

関連する問題