RhinoMock中带有存根的可选参数

时间:2012-03-27 17:51:45

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

我想存根一个接收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中设置一个选项,而不必为每个可选参数定义一个值吗?

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

谢谢。

3 个答案:

答案 0 :(得分: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不应该抱怨。

只要在测试中明确说明第一个参数的值与之无关,那么您的测试是有效且可读的。

答案 1 :(得分:0)

我自己也有类似的问题,试试

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

答案 2 :(得分:0)

现在这是一个很老的问题,但我登陆了这个页面,因为我遇到了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]);