メソッドが一度だけ呼び出されることを主張するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/7368387

質問

[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()));
}

編集されたソリューション:

[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);
}
役に立ちましたか?

解決

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

他のヒント

通話を交換します stub.Expect()stub.VerifyAllExpectations()stub.AssertWasCalled(x => x.Process(), o => o.Repeat.Once()) の中に It. 。スタブに対して複数の期待がある場合は、各アサーションを1つに配置できます It そして、それらを互いに独立して失敗(または成功)します。

スタブの作成が入ります Establish (基本的に、依存関係とテスト中のシステムの作成は、単体テストの「アレンジ」フェーズの一部です)。

また、使用しないことを検討してください GenerateMock しかし GenerateStub 模擬テスト以外の方法を指定した方法以外のテストを呼び出すと、模擬テストにつながる可能性が高いため Expect. 。 FakeIteasyのようなライブラリは、一般に、より優れた、より発見可能なAPIを提供し、学習しやすく、「成功の穴」に陥ります。

メソッドが呼び出されていることを確認したい場合 それだけ 一度、厳格な模擬が必要です:

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

sut.Process(mock)

mock.VerifyAllExpectations();

GenerateMockを使用するだけの場合、「少なくとも」チェックを実行します。これは繰り返しにもなります。times(x)も。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top