Rhino Mocks ААА Быстрый старт?
Я искал приличную информацию об использовании Rhino Mocks 3.5+ с синтаксисом AAA. Я нахожу много блогов, в которых есть смесь старого и нового, что затрудняет понимание того, как его использовать.
Было бы замечательно, если бы существовала шпаргалка Rhino Mocks AAA, как это было сделано для более ранней версии. Требуется ли, чтобы вы знали все о старых версиях Rhino, чтобы использовать более новую версию? Я уверен, что если бы я был экспертом, мне бы понравились все возможности Rhino, но сейчас я просто плаваю в информации. Любые указатели или хорошие ссылки будут полностью оценены!
4 ответа
Я написал краткий справочник по синтаксису Rhino Mocks Arrange / Act / Assert (AAA). Он содержит сжатую информацию об этом стиле синтаксиса, полученную с веб-сайта Ayende и нескольких других блогов.
Я предполагаю, что вы знакомы с официальной документацией, что, на мой взгляд, довольно хорошо. Мое предложение состоит в том, чтобы попытаться использовать Rhino, и когда вы сталкиваетесь с какой-то более конкретной проблемой, ищите решение проблемы на SO или где-то еще. Я не думаю, что есть исчерпывающая шпаргалка для насмешек Rhino. Я думаю, вам повезет больше, если бы вы спросили: "Как я могу сделать это и то, используя Rhino Mocks"
Изменить: Ну, вам не нужно использовать запись / воспроизведение при нацеливании AAA. В ААА входят три этапа:
- Упорядочить, что означает, например, настройку поведения макета класса
,
IOmicronDll mockWrapper = MockRepository.GenerateMock<IOmicronDll>();
mockWrapper.Expect(wrapper => wrapper.Lock(1, ref errors)).OutRef(string.Empty).Return(true).Repeat.Any();
mockWrapper.Expect(wrapper => wrapper.Exec(1, "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any();
mockWrapper.Expect(wrapper => wrapper.Exec("1", "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any();
Microsoft.Practices.Unity.UnityContainer c = new Microsoft.Practices.Unity.UnityContainer();
c.RegisterInstance<IOmicronDll>(mockWrapper);
Акт, который обозначает выполнение тестов
public Omicron(int deviceID) { try { if (g_Omicron == null) g_Omicron = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<CMEngineWrapper.IOmicronDll>(); m_UniqueIdentifier = Guid.NewGuid(); m_Logger = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<AdvAdmittance.Framework.ILogger>(); m_ID = deviceID; GetConfiguration(); g_InstancesCount++; m_PollThread = new Thread(new ThreadStart(DoPoll)); m_PollThread.Start(); }
И Assert, который выступает за достижение результатов
,
Assert.AreEqual("CMC 56", omicron.Type);
mockWrapper.AssertWasCalled(wrapper => wrapper.Release(), options => options.Repeat.AtLeastOnce());
Возможно, приведенные выше примеры не самые лучшие, но могут привести вас в правильном направлении.
Возможно, вы захотите начать с оригинального поста Айенде об ААА, а затем посмотреть на хороший пост в блоге Бена Холла об ААА. Чем вы могли бы использовать все полные ссылки, упомянутые в других ответах...
Сначала убедитесь, что вы знаете, что вы имеете в виду для каждого А в ААА. Вы можете знать, но я включу мои рабочие определения для полноты ответа:
- Arrange - это место, где я настраиваю входы, макеты / заглушки, объект с тестируемым методом
- Act - это место, где я вызываю тестируемый метод.
- Утверждаю, где я проверяю, что произошло или не произошло в соответствии с ожиданиями
Мне нравится помещать комментарии в мой тестовый код, чтобы напомнить мне подумать о каждой из этих вещей. Пример может помочь уточнить: предположим, у меня есть класс уровня обслуживания, который использует два класса уровня провайдера, один из "старой" системы и один из "новой" системы; Я проверяю, что метод, который копирует старые вещи в новую систему, вызывает метод "CreateThing" один раз для каждой найденной старой вещи.
[Test]
public void Should_create_new_Thing_for_each_old_Thing()
{
// -----
// arrange
// hardcode results from old system provider
List<Thing> oldThings = new List<Thing> { ... };
// old system provider
var oldProvider = MockRepository.GenerateStub<IOldSystemProvider>();
oldProvider.Stub(m=>m.GetThings()).Return(oldThings);
// new system provider
var newProvider = MockRepository.GenerateStub<INewSystemProvider>();
// service object
var svc = new MyService(oldProvider, newProvider);
//-----------
// act
var result = svc.CopyThings();
//------------
// assert
oldThings.ForEach(thing =>
newProvider.AssertWasCalled(prov => prov.CreateThing(thing)));
}