В Rhino Mock, как мне смоделировать свойство, которое можно «вызывать» более одного раза? - PullRequest
3 голосов
/ 16 ноября 2011

Это должно быть легко, поэтому я, должно быть, что-то упускаю (очень вероятно, так как я впервые использую Rhino Mock)

Я просто хочу, чтобы мой код мог звонить helm.CurrentEnterprise любое количество раз, но вместо этого я получаю:

System.InvalidOperationException occurred
  Message=Previous method 'IHelm.get_CurrentEnterprise();' requires a return value or an exception to throw.
  Source=Rhino.Mocks
  StackTrace:
       at Rhino.Mocks.Impl.RecordMockState.AssertPreviousMethodIsClose()
       at Rhino.Mocks.Impl.RecordMockState.MethodCall(IInvocation invocation, MethodInfo method, Object[] args)
       at Rhino.Mocks.MockRepository.MethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
       at Rhino.Mocks.Impl.RhinoInterceptor.Intercept(IInvocation invocation)
       at Castle.DynamicProxy.AbstractInvocation.Proceed()
       at IHelmProxy44ecadd4f07244fd96c5849febe94a58.get_CurrentEnterprise()
       at KSS.PS3.Testing.UnitTests.ModelOptions.RuleGroupTreeViewTest.AsUsedByRuleGroupModalOptionEditor() in D:\dev\5.0.0\main\Application\Testing\Tests\UnitTests\ModelOptions\RuleGroupTreeView.cs:line 54
  InnerException:

Это мой код:

   MockRepository mocks = new MockRepository();
   IHelm helm = mocks.Stub<IHelm>();
   helm.Stub(x => x.CurrentEnterprise).Return(enterprise).Repeat.Any();         

   var a2 = helm.CurrentEnterprise;
   var a2a = helm.CurrentEnterprise; // <- the exception comes from here
   var a2aa = helm.CurrentEnterprise;

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Должен сказать, что я не думаю, что издевательство действительно то, что вы хотите здесь. Вы не настраиваете ожидания так, чтобы вы могли позвонить VerifyAllExpectations, чтобы убедиться, что были вызваны определенные ожидаемые вещи. Я думаю, что в большинстве случаев это неважное различие, и ваше тестирование здесь должно работать либо с макетом, либо с заглушкой.

Просто ради потомков и будущих искателей, рассматривающих этот вопрос, причина другого результата, когда вы использовали статический метод MockRepository.GenerateMock<IHelm>() вместо экземпляра mocks.Stub<IHelm>(), в том, что вы использовали этот другой метод. Вы могли бы так же легко использовать MockRepository.GenerateStub<IHelm>(). Там ответ здесь не совсем связан с разницей между макетом и заглушкой. Ваш вопрос никак не связан с установлением ожиданий.

1 голос
/ 16 ноября 2011

Попробуйте сгенерировать макет

MockRepository.GenerateMock<IHelm>()

Вместо заглушки:

Stub<IHelm>()

Разница между заглушками и макетами ( Rhino Mocks онлайн документация)

Макет - это объект, на который мы можем рассчитывать ожидания, и который будет проверять, что ожидаемые действия действительно произошли.Заглушка - это объект, который вы используете для передачи тестируемого кода.Вы можете настроить ожидания, чтобы они действовали определенным образом, но эти ожидания никогда не будут проверены. Свойства заглушки будут автоматически вести себя как обычные свойства, и вы не можете устанавливать на них ожидания

...