【问题标题】:Optional parameters with a stub in RhinoMockRhinoMock 中带有存根的可选参数
【发布时间】:2012-04-11 07:12:06
【问题描述】:

我想存根一个接收 2 个布尔参数的函数。第一个是必需的,第二个是可选的。如果我尝试将 Arg.Is.Anything 发送给第一个但没有第二个的信息,我会收到一个错误:

System.InvalidOperationException :使用 Arg 时,必须使用 Arg.Is、Arg.Text、Arg.List、Arg.Ref 或 Arg.Out 定义所有参数。预期 2 个参数,已定义 1 个。

这是我要存根的类的示例:

   public interface IOptionalParameterTester
   {
      bool IsValid(bool mustCheck, bool checkInDatabase = true);
   }

   public class OptionalParameterTester : IOptionalParameterTester
   {
      public bool IsValid(bool mustCheck, bool checkInDatabase = true)
      {
         if (checkInDatabase)
            return true;
         else
            return false;
      } 
   }

这是一个测试样本:

  [Test]
  public void ValidateProducerTest()
  {
     IOptionalParameterTester optionalParameter = MockRepository.GenerateStub<IOptionalParameterTester>();

     optionalParameter.Stub(x => x.IsValid(Arg<bool>.Is.Anything)).Return(true);
  }

在这种情况下,如果我希望测试顺利通过,我必须定义与第一个 (Arg.Is.Anything) 相同的信息或特定的布尔值,如 true 或 false。

如果我为第一个参数设置了除 Arg.Is.Anything 以外的任何内容,我没有任何错误。

这是一个错误吗?

我可以在 RhinoMock 中设置一个选项以不必为每个可选参数定义一个值吗?

如果没有设置,是否有更好的方法来处理这种情况(最佳实践、模式等)?

谢谢。

【问题讨论】:

标签: c# visual-studio rhino-mocks optional-parameters stubs


【解决方案1】:

我想我理解你想要做什么,但是,因为这似乎是 Rhino Mocks 的一个限制(我们可以从你收到的错误消息中得出这个结论)我建议改变你的测试策略。

尝试执行以下操作:

[Test]
  public void ValidateProducerTest()
  {
     bool anyBooleanValue = true;
     IOptionalParameterTester optionalParameter = MockRepository.GenerateStub<IOptionalParameterTester>();

     optionalParameter.Stub(x => x.IsValid(anyBooleanValue)).Return(true);
  }

我知道在您的测试中,您希望 Rhino Mocks 忽略第一个参数,并且它需要可选的第二个参数,但是,根据您要测试的逻辑,只需对第一个参数进行硬编码,Rhino Mocks 不应该抱怨。

只要在您的测试中明确说明第一个参数的值不相关,您的测试就是有效且可读的。

【讨论】:

  • 感谢您的回答。我想我会在这种情况下设置所有参数,因为设置 'true' 而不是 Arg.Is.Anything 不是我想要的。
【解决方案2】:

我自己也遇到过类似的问题,试试

optionalParameter.Stub(x =&gt; x.IsValid()).IgnoreArguments().Return(true);

【讨论】:

    【解决方案3】:

    现在这是一个相当老的问题,但我登陆此页面是因为我遇到了 AssertWasCalled 和可选参数的问题。

    最终,我使用此页面上的以下语法解决了我的问题:http://petermorlion.blogspot.com/2012/11/rhinomock-assertwascalled-vs.html

    string expectedMessage = "RhinoMocks baby!";
    string actualMessage = "RhinoMocks dude!";
    var fooMock = MockRepository.GenerateMock<ifoo>();
    fooMock.Bar(actualMessage);
    
    var calls = fooMock.GetArgumentsForCallsMadeOn(x => x.Bar(string.Empty), o => o.IgnoreArguments());
    Assert.AreEqual(1, calls.Count);
    var arguments = calls[0];
    Assert.AreEqual(expectedMessage, arguments[0]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2010-10-16
      • 2021-02-28
      • 2016-10-17
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多