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

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

[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

3 に答える 3

4

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

スタブの作成が開始されますEstablish(基本的に、依存関係の作成とテスト対象のシステムは、単体テストの「配置」フェーズの一部です)。

で指定されたメソッド以外のメソッドを呼び出すと、モックは脆弱なテストにつながる可能性GenerateMockがあるため、使用しないことも検討してください。FakeItEasy のようなライブラリは、一般に、より優れた発見可能な API を提供し、習得が容易であり、「成功の穴」に陥る可能性があります。GenerateStubExpect

于 2011-09-10T06:11:01.100 に答える
4
var mock = MockRepository.GenerateMock<ICanBeProcessedOnceADay>();
mock.Expect(a => a.Process()).Repeat.Times(1);
...
mock.VerifyAllExpectations();
于 2011-09-09T23:14:02.500 に答える
3

メソッドが一度だけ呼び出されるようにしたい場合は、厳密なモックが必要です。

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

sut.Process(mock)

mock.VerifyAllExpectations();

GenerateMock だけを使用すると、「少なくとも」チェックが実行されます。これは Repeats.Times(x) にも当てはまります。

于 2015-03-02T15:21:52.093 に答える