簡體   English   中英

如何使用Times()方法設置RhinoMocks中方法調用的最大/上限?

[英]How to set a maximum/upper bound for method calls in RhinoMocks with the Times() method?

我正在嘗試測試一種方法在3至4次之間被調用:

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次?

我對RhinoAutoMocker並不熟悉,但是好像barMock被用作存根對象而不是模擬對象。

如果是存根(即使用.Stub()),則調用VerifyAllExpectations()將無效。 相反,它需要是一個模擬對象,可以在其中調用VerifyAllExpectations()

例如,這是我在測試中使用模擬的方式。

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

編輯:

只是為了擴展:

存根

存根是一個您不希望對其進行任何聲明的對象。 您可以使用存根插入方法返回值的默認值,也可以存根對void方法的調用。

在存根對象上調用.Verfiyxxxx不會產生任何效果,因為根據定義,存根無法跟蹤該對象是如何與之交互的,它只是知道“調用方法x()時,執行此其他操作”。

嘲笑

如果您想斷言與某個對象的交互(例如,一個方法被調用了4次,或者一個方法被調用帶有一組特定的參數),則需要一個模擬對象。 使用模擬需要調用Expect (這取決於您使用的模擬框架,但通常是Expect

根據定義,存根將不檢查期望,另請參閱this
但是,您可以簡單地通過調用AssertWasCalled來驗證期望
您可以按以下方式修改代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM