2013-04-05 1 views
3

J'ai récemment découvert SitePrism via le courriel rubyweekly. Il semble incroyable. Je peux voir que ça va être l'avenir.Utilisation de SitePrism avec Rspec et Capybara Caractéristiques techniques

Les exemples que j'ai vus sont principalement pour les étapes de concombre. J'essaie de comprendre comment utiliser SitePrism avec rspec.

En supposant @home_page pour la page d'accueil, et @login_page pour la login_page Je peux comprendre que

@home_page.load # => visit @home.expanded_url 

cependant, la partie que je ne suis pas sûr, est si je pense par exemple cliquez sur le " "login", et le navigateur de Capybara va à la page de connexion - comment puis-je accéder à une instance de la page de connexion, sans le charger.

@home_page = HomePage.new 
    @home_page.load 
    @home.login_link.click 
    # Here I know the login page should be loaded, so I can perhaps do 

    @login_page = LoginPage.new 
    @login_page.should be_displayed 
    @login_page.email_field.set("[email protected]") 
    @login_page.password_field.set("password") 
    @login_page.submit_button.click 

etc... 

Cela semble fonctionner. Ainsi, quand vous savez que vous êtes supposé être sur une page spécifique, vous créez une instance de cette page, et en quelque sorte le contexte "page" de capybara, comme dans page.find ("a [href = '/ sessions/new'] ") est transféré au dernier objet SitePrism? J'ai juste l'impression de manquer quelque chose ici. Je vais jouer et voir ce que je peux comprendre - je me suis dit qu'il me manquait peut-être quelque chose. Je regarde à travers la source, mais si quelqu'un a compris cela ... n'hésitez pas à partager :)

+0

Pourquoi ne voulez-vous pas mettre la méthode de connexion dans l'objet page? –

+0

Vous avez peut-être manqué le point de la question ... –

+0

pouvez-vous afficher votre fichier features/support/env.rb? – bmalets

Répondre

4

Ce que vous avez supposé s'avère être exactement comment fonctionne SitePrism :) Bien que vous souhaiterez peut-être vérifier la épilogue du readme qui explique comment vous éviter d'avoir à instancier des objets de page partout dans votre code de test. Voici un exemple:

# our pages 

class Home < SitePrism::Page 
    #... 
end 

class SearchResults < SitePrism::Page 
    #... 
end 

# here's the app class that represents our entire site: 

class App 
    def home 
    Home.new 
    end 

    def results_page 
    SearchResults.new 
    end 
end 

# and here's how to use it: 

#first line of the test... 
@app = App.new 
@app.home.load 
@app.home.search_field.set "sausages" 
@app.home.search_button.click 
@app.results_page.should be_displayed 
+0

Je n'aime pas vraiment cela avec un tel motif chaque invocation de 'home' renvoie un nouvel objet. Je préfère conserver knowlegde à propos de l'état actuel de la page à l'intérieur de l'objet page –

+1

Il me semble que le code ci-dessus viole certains priciples de [Page Object] (https://code.google.com/p/selenium/wiki/PageObjects) : "Essayez de ne pas exposer les internes de la page", "Les méthodes publiques représentent les services que la page offre". Le code en réponse expose 'search_field' et' search_button'. Ce devrait être une méthode de service avec signature, par ex. 'search (mot-clé)' à la place. –

+1

La façon dont je l'ai utilisé jusqu'ici est de traiter les objets de la page non plus comme un présentateur pour la page en cours. Ainsi, au lieu de joncher mes fonctionnalités rspec avec des sélecteurs css que je dois mettre à jour à différents endroits si cela change, je peux le définir en un seul endroit. Je prends toujours la responsabilité de ce qui est défini dans les éléments quand je suis sur la page. Je pourrais l'utiliser mal cependant. – Apie

Questions connexes