Rhino Mocks AAA Быстрый старт?

Я искал приличную информацию об использовании Rhino Mocks 3.5+ с синтаксисом AAA. Я нахожу много блогов, в которых есть множество вещей из старого и нового, которые, похоже, затрудняют понимание того, как его использовать.

Было бы здорово, если бы был Rhin Mocks AAA Cheat Sheet, как это было сделано для более ранней версии. Требуется ли вам знать все о старых версиях Rhino, чтобы использовать более новую версию? Я уверен, что если бы я был экспертом, мне понравились бы все возможности в Rhino, но пока я просто плаваю в информации. Любые указатели или хорошие ссылки будут полностью оценены!

Ответ 2

Я предполагаю, что вы знакомы с официальной документацией что, на мой взгляд, неплохо. Мое предложение состоит в том, чтобы попытаться использовать Rhino, и когда вы столкнетесь с некоторыми более конкретными проблемами, поиск решения зависает на SO или где-то еще. Я не думаю, что есть всеобъемлющий чит-лист для носорогов. Думаю, вам повезет больше: "Как я могу это сделать, используя Rhino Mocks"

Изменить: Ну, вам не нужно использовать запись/воспроизведение при настройке AAA. В 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);
  • Act, который означает выполнение тестов

    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());

Возможно, приведенные выше примеры не самые лучшие, но могут помочь вам в правильном направлении.

Ответ 3

Сначала убедитесь, что вы знаете, что вы имеете в виду для каждого A в AAA. Вы можете знать, но я буду включать свои рабочие определения для полноты ответа:

  • Упорядочить где я устанавливаю входы, mocks/stubs, объект с испытанным методом
  • Акт - это то, где я вызываю тестируемый метод
  • Утверждение - это где я проверяю произошедшие события или не в соответствии с ожиданием

Мне нравится помещать комментарии в свой тестовый код, чтобы напомнить мне подумать обо всех этих вещах. Пример может помочь уточнить: предположим, что у меня есть класс уровня обслуживания, который использует два класса уровня поставщика, один из "старой" системы и один из "новой" системы; Я проверяю, что метод, который копирует старые вещи в новую систему, вызывает метод "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)));
}