首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Times()方法在RhinoMocks中为方法调用设置最大值/上限?

如何用Times()方法在RhinoMocks中为方法调用设置最大值/上限?
EN

Stack Overflow用户
提问于 2015-05-19 06:45:23
回答 2查看 75关注 0票数 0

我试图测试一个方法被调用了3到4次:

代码语言:javascript
复制
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rhino.Mocks;
using StructureMap.AutoMocking;

namespace AutoMockPlayground
{
    [TestClass]
    public class SomeTests
    {
        [TestMethod]
        public void Bara_ShouldBeCalledThreeOrFourTimes()
        {
            var autoMocker = new RhinoAutoMocker<Foo>(MockMode.AAA);

            var barMock = autoMocker.Get<IBar>();

            // Bara() should not be called more than four times
            barMock.Stub(bar => bar.Bara()).Repeat.Times(3, 4);

            autoMocker.ClassUnderTest.DoSomeThing();

            barMock.VerifyAllExpectations();
        }
    }

    public interface IBar
    {
        void Bara();
    }

    public class Foo
    {
        private readonly IBar _bar;

        public Foo(IBar bar)
        {
            _bar = bar;
        }

        public void DoSomeThing()
        {
            _bar.Bara();
            _bar.Bara();
            _bar.Bara();
            _bar.Bara();
            _bar.Bara();
        }
    }
}

我使用的是Repeat.Times(int min, int max),但max参数似乎没有任何效果。虽然Bara()被调用了5次,但是这个测试还是通过了。

如何在我的测试中表示Bara()应该被调用3到4次?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-19 08:25:07

存根按定义不会检查期望,也见

但是,您可以只通过调用AssertWasCalled来验证期望

您可以按以下方式修改代码:

代码语言:javascript
复制
    var autoMocker = new RhinoAutoMocker<Foo>(MockMode.AAA);

    var barMock = autoMocker.Get<IBar>();

    autoMocker.ClassUnderTest.DoSomeThing();

    // Bara() should not be called more than four times
    barMock.AssertWasCalled(bar => bar.Bara(),     
                            options => options.IgnoreArguments().Repeat.Times(3,4));
票数 1
EN

Stack Overflow用户

发布于 2015-05-19 07:49:23

我不熟悉RhinoAutoMocker,但看起来barMock被用作存根对象,而不是模拟对象。

如果它是存根(即通过使用.Stub()),那么调用VerifyAllExpectations()将没有效果。相反,它需要是一个模拟对象,在其中调用VerifyAllExpectations()应该可以工作。

例如,下面是我如何在测试中使用模拟。

代码语言:javascript
复制
var mockObject = MockRepository.GenerateMock<IFoo>();

mockObject.Expect(o => o.CallSomething().Repeat.Times(1);

mockObject.VerifyAllExpecttions();

所以而不是

barMock.Stub(bar => bar.Bara()).Repeat.Times(3, 4);

你能做到吗?

barMock.Expect(bar => bar.Bara()).Repeat.Times(3, 4);

编辑:

只是为了扩大:

Stub

存根是一个您不打算对其进行断言的对象。您可以使用存根插入方法返回值的默认值,或者对void方法进行存根处理。

对存根对象调用.Verfiyxxxx不会产生任何影响,因为存根根据定义不会跟踪该对象是如何交互的,它只知道“当调用方法x()时,执行其他操作”。

Mock

如果希望断言与对象的交互(例如,调用方法4次,或者使用特定的参数集调用方法),则需要一个模拟对象。使用模拟需要调用Expect (这取决于您使用的模拟框架,但通常是Expect)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30318510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档