2013-12-05 1 views
0

Я использую раскадровки и 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 равен нулю. Я что-то упускаю? В качестве альтернативы, может ли кто-нибудь предложить подход для тестирования контроллеров представлений, которые ссылаются на контроллер навигации? Кроме того, для проверки того, что контроллер хочет выполнить segue в определенных условиях. Есть ли какой-нибудь макет или заглушка, которую я мог бы использовать?

+1

Метод 'tests' создает новый интерфейс UIWindow и устанавливает на нем контроллер корневого представления, который будет тестировать контроллер. Также, если вы скрываете навигационную панель, почему она там? Возможно, вместо этого используется модальная модель представления. 'self.presentViewController (@sign_up_facebook_controller, animated: true, completion: noil)' – FluffyJack

+0

Вы бы назвали это из контроллера представления, который его отображает. – FluffyJack

+0

Да, для примера, который я дал, ваше предложение позволит избежать проблемы. Тем не менее, у меня есть другие контроллеры в раскадровки, которые настраивают элементы NavigationBarButtonItems, поэтому я все равно получаю ту же ошибку. Я нашел способ, который работает сейчас (см. Ниже). Спасибо за ваш комментарий, хотя, это увеличило мое понимание того, что происходит. –

ответ

1

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

  1. Тест "это описание выводится
  2. Встроенного метод«контроллера»вызывается который инициализирует контроллер представления (я заменяю метод ниже)
  3. Испытательная система ждет, пока изображение не загрузится (поэтому любая инъекция зависимостей, необходимая до представленияDidLoad, должна выполняться в методе «контроллер»)
  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