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

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

1 голос
/ 28 марта 2012

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

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

0 голосов
/ 24 сентября 2014

Это довольно старый вопрос сейчас, но я попал на эту страницу, потому что у меня были проблемы с 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]);
0 голосов
/ 20 мая 2014

Просто у меня была похожая проблема, попробуйте

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

...