См этого кода:сгенерированный сервисный макет: все, кроме RhinoMocks, не удается?
TicketStoreService fakeTicketStoreService =
MockRepository.GenerateMock<TicketStoreService>();
fakeTicketStoreService.Expect(service => service.DoSomething(Arg.Is(new Guid()))
.Return(new Guid());
fakeTicketStoreService.DoSomething(Arg.Is(new Guid()));
fakeTicketStoreService.VerifyAllExpectations();
Заметьте, что DoSomething
не является виртуальным methodcall в сгенерированном классе, который наследует от NO интерфейса. Так что это не должно работать, в соответствии с общеизвестными. Но это так.
Проблема заключается в том, что это единственный (некоммерческое) рамки, которые могут сделать это:
- Rhino.Mocks работает, и проверка работы тоже
- FakeItEasy говорит, что не находит конструктор по умолчанию (вероятно, просто неправильное сообщение исключение):
No default constructor was found on the type SomeNamespace.TicketStoreService
- Moq дает что-то в здравом уме и понятно:
Invalid setup on a non-virtual (overridable in VB) member: service=> service.DoSomething
- Nsubstitute дает сообщение
System.NotSupportedException: Cannot serialize member System.ComponentModel.Component.Site of type System.ComponentModel.ISite because it is an interface.
Мне действительно интересно, что здесь происходит с каркасами, кроме Moq. «Причудливые новые» рамки, похоже, также имеют начальный перфоманс, возможно, готовят кеширование типов и сериализуют материал, в то время как RhinoMocks каким-то образом удается создать очень «тонкий» макет без рекурсии. Я должен признать, что мне очень не нравилось RhinoMocks, но здесь оно сияет .. к сожалению.
Итак, есть ли способ получить это для работы с новыми (некоммерческими!) Фальшивыми фреймворками или каким-то образом получить разумное сообщение об ошибке (описывающее, какой из 6 параметров, которые я фактически использовал, различен, каким образом) из Rhino.Mocks? И почему Rhino.Mocks достигают этого, когда ясно, что каждая среда Mocking утверждает, что она может работать только с виртуальными методами, когда задан конкретный класс?
* Давайте не сорвать обсуждение, говорить об альтернативных подходах, таких как экстракт & Override или во время выполнения прокси структур Mocking как JustMock/TypeMock/Родинка или новая Подделка рамка, я знаю, что это, но это было бы менее идеальным решение, по причинам, выходящим за рамки этой темы.
MockRepository возвращает Mock? в случае Moq? –
Anton
@ Anton no, Mock, потому что TicketStoreService - это сгенерированная служба, не получающая от интерфейса. Поведение макета понятно, проблема в том, почему RhinoMocks работает и почему другие структуры не могут это сделать? –
hko