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

Rhino Mocks Restub函数

  •  2
  • SiberianGuy  · 技术社区  · 15 年前

    有时我会在测试类设置中存根依赖项,然后想在具体的测试中重新发布其中的一些依赖项。但Rhino mocks只记得第一个存根值,这有点不方便。

    someStub.Stub(x => x.SomeMethod(1)).Return(100);
    var value1 = someStub.SomeMethod(1);
    someStub.Stub(x => x.SomeMethod(1)).Return(200);
    var value2 = someStub.SomeMethod(1);
    

    值2将等于100。

    这是设计的行为吗?有什么解决办法吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    我遇到了自己做这件事的需要。我通过使用 WhenCalled 函数,在调用函数时传递要执行的操作。这将给你更多的灵活性,你可以返回在不同的点。

    有关此stackoverflow线程的更多信息/活动: Rhino Mocks: Re-assign a new result for a method on a stub Changing previously stubbed calls with Rhino Mocks .

    我知道这是旧的,但希望它能帮助别人。

        2
  •  1
  •   Jonny Cundall    15 年前

    你可以通过继承来解决这个问题。如果您有一个基本测试类和一些运行测试的测试子类,则可以将返回值设置为基本测试类的受保护属性,并在子类中的某个点上设置该值。调用初始化。 所以(使用MSTEST)可以:

    在你的基础班:

    protected int ReturnVal{get; set;}
    
    public void Init()
    {
    someStub = MockRepository.GenerateMock<ISomeStub>();
    someStub.Stub(x => x.SomeMethod(1)).Return(ReturnVal);
    }
    

    在你的子类中:

      [TestInitialize]
        public override Init()
        {
        ReturnVal = 200;
        base.Init();
        }
    
        3
  •  0
  •   Grzenio    15 年前

    是的,这是设计的行为。

    我大部分时间使用的解决方法是创建一个helper方法,该方法将为您设置存根,即:

    private X MockX()
    {
      return MockX(100);  
    }
    
    private X MockX(int returnValue)
    {
      var x = MockRepository.GenerateStub<X>();
      someStub.Stub(x => x.SomeMethod(1)).Return(returnValue);
      return x;
    }
    

    然后在测试中,不使用在安装程序中创建的模拟,而是调用适当的函数。附加的好处是,很明显,您的测试使用的是返回值的一些特殊值。

        4
  •  0
  •   Wim Coenen    15 年前

    您可以使用模拟而不是存根来记录这样的场景:

    [Test]
    public void Mytest()
    {
       var mocks = new MockRepository();
       var someMock = mocks.DynamicMock<IFoo>();
       someMock.SomeMethod(1);
       LastCall.Return(100);
       someMock.SomeMethod(1);
       LastCall.Return(200);
       mock.Replay(); // stop recording, go to replay mode
    
       // actual test, normally you would test something which uses the mock here
       int firstResult = someMock.SomeMethod(1);
       int secondResult = someMock.SomeMethod(2);
    
       // verify the expectations that were set up earlier 
       // (will fail if SomeMethod is not called as in the recorded scenario)
       someMock.VerifyAll();
    }
    

    犀牛模型中的模型比树桩更复杂。它们还将行为的定义与断言的创建混合在一起(记录阶段两者都做),并且它们依赖于方法调用的顺序。这就导致了脆弱的测试;除非你真的需要模拟,否则就坚持存根。