てすとを書くなど
海方面に去りたかったのですが、何となく引き籠り、というか留守番。こないだ試験の雛型までできたので、という事で試験をナニ。
むむむ
とりあえず devise のてすつはしない方向。以下なエントリを確認させて頂きつつ云々してみました。
とりあえず factory なソレを Gemfile に追加。
group :development, :test do gem 'factory_girl_rails', '4.1.0' gem 'rspec' gem 'sqlite3', '1.3.5' gem 'rspec-rails', '2.11.0' end
で、bundle install しておいて spec/support に云々、とのこと。
もろもろでっち上げて試験動かしてみたのですが、失敗。よくよく考えてみるに factory なソレを作っていない。あら、でっちあげてもマクロが読めてなさげな Failure なメセジ。
あ、spec/supports だ。とほほ。spec/support って名前にしてたよorz
やれやれ、と思ったらまだ駄目。ControllerMacros の名前解決が云々とのこと。あら? よくよく見たら spec/support で良いのですね。spec_helper.rb の require な記述が以下。
# Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories. Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
で、再び元の場所に戻ってしまっております。そいえば控えてなかったんですが出てるエラーが以下なカンジです。
Failure/Error: login_user NameError: undefined local variable or method ...
試験の書き方てきに以下なカンジなのですが
context "When user is signed in" do before do login_user end it "responds successfully with on HTTP 200 status code" do get :index expect(response).to be_success expect(response.code).to eq("200") end
以下のようにしてみても動作変わらず。
context "When user is signed in" do # before do # login_user # end it "responds successfully with on HTTP 200 status code" do login_user get :index expect(response).to be_success expect(response.code).to eq("200") end
むむ、色々確認しつつ云々してるのですが、不具合が解決できぬ。
undefined method `login_user' for ControllerMacros:Module
てどーゆー意味だろ。未定義て。ちなみに spec/support/controller_macros.rb が以下。
module ControllerMacros def login_admin @request.env["devise.mapping"] = Devise.mappings[:admin] sign_in FactoryGirl.create(:admin) end def login_user controller.stub(:authenticate_user!).and_return true @request.env["devise.mapping"] = Devise.mappings[:user] user = FactoryGirl.create(:user) sign_in user end end
うーん、解決しない。とりあえず一旦置いてみることに。
できてた
ええと、spec/support/devise.rb を作って
RSpec.configure do |config| config.include Devise::TestHelpers, :type => :controller config.include ControllerMacros, :type => :controller end
extend じゃなくて include にしてます。で、spec/factory.rb を以下に。
FactoryGirl.define do factory :user do # name "Michael Hartl" email "michael@example.com" password "foobarbaz" password_confirmation "foobarbaz" end end
name= が無い、って言われたのでコメントアウトしてパスワード 8 文字以上、って言われたので中身を増やしています。今度は
ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
みたいな怒られかた。ええと、config/environments/test.rb に以下を追加。
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
まだ駄目。そもそもな試験の書き方が微妙なのかどうか。今はこんなカンジになっているのですが、
context "When user is signed in" do before do login_user end it "responds successfully with on HTTP 200 status code" do get :index expect(response).to be_success expect(response.code).to eq("200") end it "renders the index template" do get :index expect(response).to render_template("index") end after do sign_out :user end end
こりゃ実装が駄目なのかな。レスポンスが 302 とか戻ってるみたいだし。
とりあえず長くなりそうなのでここで再度エントリ投入。
続き
レスポンス 302 なので be_success ではない模様。以下を参照させて頂き、
rspec/support/controller_macros.rb の login_user メソドを以下にしたら試験パスしました。
def login_user controller.stub(:authenticate_user!).and_return true @request.env["devise.mapping"] = Devise.mappings[:user] user = FactoryGirl.create(:user) user.confirm! sign_in user end
いやはや。
燃料入れつつ製造続行するので、控えがあれば追記するかもしれません。