2015-07-07 1 views
1

Я хочу проверить, вызван ли метод в тесте.Rhino Mock Expect.Call() на самом деле вызывает метод не только для создания ожидания

Моя проблема в том, что, когда я хочу создать ожидания, она не работает, как я думал. Следующая строка на самом деле работает метод, не только создают ожидания:

Expect.Call(() => mockedService.MethodThatIExpectToRun(params)); 

Существует еще один способ:

mockedService.Expect((s=> s.MethodThatIExpectToRun(params))); 

Но это также на самом деле работает метод, не только создает ожидание должно быть исполнено тест.

И эта строка, которая утверждает, что метод не был вызван, на самом деле вызывает метод, а не только проверяет, был ли он вызван.

mockedService.AssertWasCalled(s=> s.MethodThatIExpectToRun((params))); 

Дополнительная информация: MethodThatIExpectToRun возвращается void

Для комментариев prgmtc в:

IService mockedService = MockRepository.GeneratePartialMock<Service>(mockedRepository_1, ..., mockedRepository_n); 
+0

Какой тип времени исполнения mockedService? Это динамический макет объекта, созданный RhinoMocks? Вы издеваетесь над интерфейсом или конкретным классом? – prgmtc

+0

Это partialMock. Мне нужно было передать ему какой-то издевательский репозиторий, и мне нужно было заглушить некоторые из методов класса сервиса. Я также обновляю вопрос. – jannagy02

ответ

0

Обычно, когда у вас есть PartialMock, что призванию реальный метод при установке Stub или Expect, это означает, что virtual ключевое слово отсутствует на методе ,

Удостоверяются, что Service.MethodThatIExpectToRun является virtual.

0

Более общее (хотя, возможно, менее полезным) замечание: Частичные издевается может указывать на дизайн запах код под тестированием. Если вы хотите только оживить часть класса, возможно, у этого класса слишком много обязанностей и его нужно разделить на несколько классов? Таким образом, вы можете полностью изолировать обязанности/коллабораторы и не нуждаетесь в конструкции partialmock. Если вы издеваетесь (не частично макет) с интерфейсом или виртуальным членом конкретного класса, вызов не перейдет к реальной реализации.

Например:

 Console.WriteLine("Real object: "); 
     new Foo().Bar(); 

     Console.WriteLine("Mocked object: "); 
     var aFoo = MockRepository.GenerateMock<Foo>(); 
     aFoo.Expect(f => f.Bar()); 

     aFoo.Bar(); 

     ... 

     public class Foo 
     { 
      public virtual void Bar() 
      { 
       Console.WriteLine("REAL IMPLEMENTATION"); 
      } 
     } 

Выходы:

Real object: 
REAL IMPLEMENTATION 
Mocked object: 
+0

«Частичный mock будет вызывать метод, определенный в классе, если вы не определите математическое ожидание этого метода». Поэтому, если вы определяете его, он не должен вызывать первоначальную реализацию. – jannagy02

+0

Спасибо за вашу поддержку, но я узнал, что мой метод не был отмечен как виртуальный, и это была проблема. – jannagy02

+0

Последняя строка, на которую вы ссылаетесь "(помните, что когда все ожидания для метода будут разрешены, метод будет перенаправлен обратно на реализацию)" на самом деле говорит, что если вы настроите ожидание для одного звонок и два вызова, второй вызов будет идти к фактической реализации, а не к издеваемому. – forsvarir