代码之家  ›  专栏  ›  技术社区  ›  Matthias

制定一般和具体的存根方法?

  •  2
  • Matthias  · 技术社区  · 14 年前

    伊福

    public interface IFoo
    {
        int DoSomething(int value);
    }
    

    存根是在 测试初始化 )-方法的测试夹具和存储在一个属性几乎所有的测试方法都需要一个 :

    this.Foo = MockRepository.GenerateStub<IFoo>();
    

    设置 方法:

    this.Foo.Stub(f => f.DoSomething(0)).IgnoreArguments().Return(0).WhenCalled(mi => mi.ReturnValue = mi.Arguments[0]);
    

    然而,现在 工作:

    this.Foo.Stub(f => f.DoSomething(42)).Return(43);
    


    有没有办法在模拟对象上同时指定特定存根和常规存根?


    我也不希望通过约束明确排除一般语句中的“42”,因为这将对其他测试产生负面影响。
    回溯记录 也不是一个选项,因为它似乎也重置了其他存根。

    谢谢你的回答!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Grzenio    14 年前

    我认为不可能“重置”预期。在这种情况下,我将避免在设置中设置此模拟,而是创建一个方法来轻松设置它,并从每个测试中调用它:

    private IFoo SetUpFoo()
    {
      IFoo foo = MockRepository.GenerateStub<IFoo>();
      foo.Stub(f => f.DoSomething(0)).IgnoreArguments().Return(0).WhenCalled(mi => mi.ReturnValue = mi.Arguments[0]);
    }
    

    然后在每个需要标准foo的测试中使用这个方法:

    [Test]
    public void StandardTest()
    {
      IFoo foo = SetUpFoo();
      ...
    }
    

    在您的特殊情况下,您必须手动创建foo并设置期望值:

    [Test]
    public void SpecialTest()
    {
      IFoo foo = MockRepository.GenerateStub<IFoo>();
      foo.Stub(f => f.DoSomething(42)).Return(43);
      ...
    }
    

    当然,您会得到一些代码重复,但至少可以清楚地知道在哪个测试中使用了哪些期望。

        2
  •  0
  •   Community CDub    8 年前

    我刚刚找到了真正“覆盖”存根/期望的解决方案: Rhino Mocks: How to clear previous expectations on an object?

    应用于我的问题,我现在可以写:

    this.Foo.Stub(f => f.DoSomething(42)).Return(43).Repeat.Any();
    

    任何人的文件都说:

    重复该方法任意次数。这有特殊的影响,因为此方法现在将忽略Ordering。

    所以这似乎既不是一个bug,也不是一个未记录的特性。