Необязательные параметры с заглушкой в ​​RhinoMock

Я хочу заглушить функцию, которая получает 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, чтобы не определять значение для каждого дополнительного параметра?

Если нет настройки, что лучше сделать для этого случая (лучшая практика, шаблон и т. д.)?

Спасибо.


person Samuel    schedule 27.03.2012    source источник
comment
Для справки stackoverflow.com/questions/6669623/   -  person Jason Evans    schedule 27.03.2012
comment
Спасибо за информацию. Мне нравится Moq, но сейчас я работаю над проектом RhinoMock.   -  person Samuel    schedule 28.03.2012


Ответы (3)


Я думаю, что понимаю, что вы пытаетесь сделать, но, поскольку кажется, что это ограничение 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 не должны жаловаться.

Пока в вашем тесте четко указано, что значение первого параметра не имеет значения, ваш тест действителен и читабелен.

person Sergio Romero    schedule 27.03.2012
comment
Спасибо за ответ. Я думаю, что в этом случае я установлю все параметры, потому что установить «true» вместо Arg‹bool›.Is.Anything — это не то, что я хочу. - person Samuel; 28.03.2012

У самого была аналогичная проблема, попробуйте

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

person pms1969    schedule 20.05.2014

Сейчас это довольно старый вопрос, но я попал на эту страницу, потому что у меня были проблемы с AssertWasCalled и необязательными параметрами.

В конце концов, я решил свою проблему, используя следующий синтаксис, найденный на этой странице: //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]);
person nirmal    schedule 24.09.2014