Тестирование контроллеров представления в раскадровках в RubyMotion

Я использую раскадровки и RubyMotion. В моей спецификации у меня есть следующее:

describe "SignUp scene" do

  tests SignUpFacebook, :storyboard => 'LoginStoryboard', :id => 'SignUp'

  it "some test" do
    tap 'FirstName'
    # some test here      
  end

end

В контроллере представления у меня есть

class SignUpFacebook < UIViewController

  def viewWillAppear animated
    super
    self.navigationController.setNavigationBarHidden (true, animated:false)
  end

  def viewWillDisappear animated
    super
    self.navigationController.setNavigationBarHidden (false, animated:false)
  end

  #some code to be tested
end

когда я "рейкую спецификацию", я получаю сообщение об ошибке:

[ERROR: NoMethodError - undefined method `setNavigationBarHidden' for nil:NilClass]

Итак, navigationController равен нулю. Я что-то пропустил? В качестве альтернативы, может ли кто-нибудь предложить подход для тестирования контроллеров представления, которые ссылаются на контроллер навигации? Кроме того, для проверки того, что контроллер хочет выполнить переход в определенных условиях. Есть ли какой-то макет или заглушка, которую я мог бы использовать?


person Martin Lockett    schedule 05.12.2013    source источник
comment
Метод tests создает новый UIWindow и устанавливает в нем корневой контроллер представления в качестве тестируемого контроллера представления. Кроме того, если вы скрываете панель навигации, почему она там? Вместо этого можно использовать модальную модель представления. self.presentViewController(@sign_up_facebook_controller, animated:true, completion:nil)   -  person FluffyJack    schedule 07.12.2013
comment
Вы бы вызвали это из контроллера представления, который его отображает.   -  person FluffyJack    schedule 07.12.2013
comment
Да, для примера, который я привел, ваше предложение позволит избежать проблемы. Однако у меня есть другие контроллеры в раскадровках, которые настраивают NavigationBarButtonItems, поэтому я все равно получаю ту же ошибку. Я нашел способ, который работает сейчас (см. ниже). Однако спасибо за ваш комментарий, он расширил мое понимание того, что происходит.   -  person Martin Lockett    schedule 08.12.2013


Ответы (1)


хорошо, я нашел пример метода, который переопределяет метод (macbacon?), который возвращает контроллер. Я загрузил здесь контроллер и настроил навигационный контроллер, так что теперь тест запускается. Перед запуском каждого теста последовательность событий такова:

  1. Выводится описание теста 'it'
  2. Вызывается встроенный метод «контроллера», который создает экземпляр контроллера представления (я переопределил метод ниже)
  3. Тестовая система ожидает загрузки представления (поэтому любая инъекция зависимостей, необходимая до viewDidLoad, должна выполняться в методе «контроллер»)
  4. Тестовая система вызывает код «before do .. end»
  5. Тестовая система запускает тест
  def controller
    unless @controller
          storyboard = UIStoryboard.storyboardWithName("LoginStoryboard", bundle:nil)
          @controller = storyboard.instantiateViewControllerWithIdentifier('SignUpFacebook')
          appDelegate = UIApplication.sharedApplication.delegate
          appDelegate.setWindow UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
          appDelegate.window.rootViewController = UINavigationController.alloc.initWithRootViewController @controller
    end
    @controller
  end
person Martin Lockett    schedule 05.12.2013