RSpec: beforeで詰まった(itの中から見えるもの見えないもの)
ディレクトリ構成
E2Etest └ pages └ admin_login_page.rb └ spec └ test_spec.rb
# admin_login_page.rb class AdminLoginPage def initialize(driver) @driver = driver @driver.get("https://xxx.wordpress.com/wp-admin/") end ~後略~
# test_spec.rb require 'selenium-webdriver' Dir[File.expand_path("../../pages/", __FILE__) << '/*.rb'].each do | file | require file end describe "ログインして書いて編集して削除するシナリオ" do @driver = Selenium::WebDriver.for :firefox it "正しいID/PWでログインできること" do # ログインページでログインする @login_page = AdminLoginPage.new(@driver) # loginの戻り値は AllPostsPage @all_posts_page = @login_page.login # 今回はtitleに「投稿」という文字列が含まれているかで比較 expect(@driver.title).to include "投稿" end end
を実行すると下記のようなエラーになる
:spec sakaimo$ rspec test_spec.rb F Failures: 1) ログインして書いて編集して削除するシナリオ 正しいID/PWでログインできること Failure/Error: @login_page = AdminLoginPage.new(@driver) NoMethodError: undefined method `get' for nil:NilClass # /Users/sakaimo/mydev/selenium/E2Etest/pages/admin_login_page.rb:5:in `initialize' # ./test_spec.rb:13:in `new' # ./test_spec.rb:13:in `block (2 levels) in <top (required)>' Finished in 0.00099 seconds (files took 2.96 seconds to load) 1 example, 1 failure Failed examples: rspec ./test_spec.rb:10 # ログインして書いて編集して削除するシナリオ 正しいID/PWでログインできること
admin_login_page.rb の initialize に渡される driver が nil みたい。
# test_spec.rb require 'selenium-webdriver' Dir[File.expand_path("../../pages/", __FILE__) << '/*.rb'].each do | file | require file end describe "ログインして書いて編集して削除するシナリオ" do before do #←ここ! @driver = Selenium::WebDriver.for :firefox end it "正しいID/PWでログインできること" do # ログインページでログインする @login_page = AdminLoginPage.new(@driver) # loginの戻り値は AllPostsPage @all_posts_page = @login_page.login # 今回はtitleに「投稿」という文字列が含まれているかで比較 expect(@driver.title).to include "投稿" end end
で解決しました。
- 元のコードでは@driverはitの中からは見えない、ってことなのかな。
- beforeは「exampleの実行前に毎回呼ばれる」からitの中でも見える、ってことなのかな。