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の中でも見える、ってことなのかな。