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
var mock = MockRepository.GenerateMock<ICanBeProcessedOnceADay>();
mock.Expect(a => a.Process()).Repeat.Times(1);
...
mock.VerifyAllExpectations();
于 2011-09-09T23:14:02.500 回答
4

我会在. stub.Expect()_ 如果您对存根有多个期望,则可以将每个断言放在一个中,并让它们彼此独立地失败(或成功)。stub.VerifyAllExpectations()stub.AssertWasCalled(x => x.Process(), o => o.Repeat.Once())ItIt

存根的创建将进入Establish(本质上,任何依赖项的创建和被测系统是单元测试中“安排”阶段的一部分)。

还要考虑不要使用GenerateMock,但是GenerateStub当您调用其他方法而不是用Expect. 像 FakeItEasy 这样的库通常会提供更好、更容易发现的 API,更容易学习,会让你陷入“成功的坑”。

于 2011-09-10T06:11:01.100 回答
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 回答