C# 在RhinoMock中带有存根的可选参数

C# 在RhinoMock中带有存根的可选参数,c#,visual-studio,rhino-mocks,optional-parameters,stubs,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 {

我想要存根一个接收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);
  }
[测试]
public void ValidateProducerTest()
{
IOOptions ParameterTester optionalParameter=MockRepository.GenerateSub();
optionalParameter.Stub(x=>x.IsValid(Arg.Is.Anything)).Return(true);
}
在这种情况下,如果希望测试无误通过,则必须定义与第一个测试相同的信息(Arg.Is.anywhere)或特定的布尔值,如true或false

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

是虫子吗

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

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


谢谢。

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

尝试执行以下操作:

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

     optionalParameter.Stub(x => x.IsValid(anyBooleanValue)).Return(true);
  }
[测试]
public void ValidateProducerTest()
{
bool anyBooleanValue=true;
IOOptions ParameterTester optionalParameter=MockRepository.GenerateSub();
optionalParameter.Stub(x=>x.IsValid(anyBooleanValue)).Return(true);
}
我知道,在您的测试中,您希望Rhino Mocks忽略第一个参数,并且它需要可选的第二个参数,但是,根据您想要测试的逻辑,只需硬编码第一个参数,Rhino Mocks不应该抱怨


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

我自己也有类似问题,请尝试


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

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

最后,我使用此页面上的以下语法解决了我的问题:

string expectedMessage=“RhinoMocks baby!”;
string actualMessage=“RhinoMocks dude!”;
var fooMock=MockRepository.GenerateMock();
fooMock.Bar(实际消息);
var调用=fooMock.GetArgumentsForCallsMadeOn(x=>x.Bar(string.Empty),o=>o.IgnoreArguments());
aresequal(1,calls.Count);
变量参数=调用[0];
AreEqual(expectedMessage,参数[0]);

供参考,而非X供参考。我喜欢Moq,但我目前工作的项目是RhinoMock。谢谢你的回答。我想我会在这种情况下设置所有参数,因为设置'true'而不是Arg.Is.Anything不是我想要的。
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]);