pfaffman
(Jay Pfaffman)
2020 年 3 月 30 日午後 4:33
1
数日前から失敗するテストケースが見つかりました。タイムゾーンに関連する問題のようですが、私のプラグインが原因だとは思えないのですが、何か見落としているでしょうか?
require 'rails_helper'
describe TopicDefaultTag::ActionsController do
before do
Jobs.run_immediately!
end
it 'can list' do
sign_in(Fabricate(:user))
get "/topic-default-tag/list.json"
expect(response.status).to eq(200)
end
end
Running Rspec: plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb
Loading plugins while running specs
An error occurred while loading ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb.
Failure/Error: UserOption.create!(user_id: id)
NoMethodError:
undefined method `timezone' for #<UserOption:0x000055dd7af16ca8>
Did you mean? timeout
# ./app/models/user.rb:1343:in `create_user_option'
# (eval):19:in `block (2 levels) in run_file'
# ./spec/rails_helper.rb:79:in `<top (required)>'
# ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb:1:in `require'
# ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb:1:in `<top (required)>'
No examples found.
Finished in 0.00005 seconds (files took 3.52 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples
「いいね!」 1
david
(David Taylor)
2020 年 3 月 30 日午後 4:35
2
タイムゾーンカラムが user_options テーブルに不足しているようです。テストデータベースで最近マイグレーションを実行しましたか?RAILS_ENV=test bin/rake db:migrate
「いいね!」 2
pfaffman
(Jay Pfaffman)
2020 年 3 月 30 日午後 4:43
3
いや、まだです。開発データベースでマイグレーションを実行しましたが、テスト環境では行っていません。ありがとう、David!
今何が起きているのかはわかりませんが、この問題ほど初心者向けではないはずです。
「いいね!」 2
david
(David Taylor)
2020 年 3 月 30 日午後 4:47
4
マイグレーションが不足している場合は、メッセージが表示されるはずです
ただし、これは rails_helper を使用している場合に限ります。spec ファイルの先頭に require "rails_helper" を追加する必要があるかもしれません。それにより、現在直面している他の問題も解決する可能性があります。
編集:ふむ… .rspec ファイルに --require rails_helper を追加して、手動で追加する必要をなくすべきかもしれませんね
「いいね!」 2
pfaffman
(Jay Pfaffman)
2020 年 3 月 30 日午後 5:07
5
それは私がやりそうなバカげたエラーのようです!残念なことに、私は require 'rails_helper' を含めています。
もしかすると、bundle exec rake autospec ではなく ./bin/rake autospec を実行したのが問題だったのかもしれませんが、それでも Travis で失敗しています。そして今、この仕様が私のたった一つの小さな仕様に対して理解できないようなことをいろいろと行っているようですが、結果を待つことにします。
改めてありがとうございます。
「いいね!」 2
sign_in ヘルパー関数で問題が発生しています。ご協力をいただければ幸いです! :
password_confirmation: honeypot,
challenge: challenge.reverse
}
expect(response.status).to eq(200)
body = response.parsed_body
User.find(body["user_id"])
end
def sign_in(user)
get "/session/#{user.encoded_username}/become"
user
end
def sign_out
delete "/session"
end
def read_secure_session
id = begin
このテストで使用すると、current_user が設定されないようで、200 ではなく 403 エラーで失敗してしまいます。
it "followers" do
get "/u/#{user2[:username]}/follow/followers.json", :params => { :type => 'followers' }
expect(response.status).to eq(200)
expect(response.parsed_body[0]['id']).to eq(user1.id)
expect(response.parsed_body[0]['username']).to eq(user1.username)
end
end
it "updates followers" do
sign_in(user1)
put "/follow/#{user2.username}.json", params: { follow: true }
expect(response.status).to eq(200)
expect(response.parsed_body['following']).to eq(true)
end
end
問題を切り分けるために以下のようにテストを実行していますが、この方法でもうまくいきません。
LOAD_PLUGINS=1 RAILS_ENV=test rspec plugins/discourse-follow/spec/requests/follow_controller_spec.rb:32
対応するコントローラーに byebug を追加して current_user を確認すると、nil になっています(そのため 403 エラーが発生しているのだと思います)。
class Follow::FollowController < ApplicationController
def index
end
def update
params.require(:username)
params.require(:follow)
raise Discourse::InvalidAccess.new unless current_user
raise Discourse::InvalidParameters.new if current_user.username == params[:username]
if user = User.find_by(username: params[:username])
updater = Follow::Updater.new(current_user, user)
updater.update(params[:follow])
following = user.followers.include?(current_user.id.to_s)
render json: success_json.merge(following: following)
else
Randomized with seed 50945
[5, 14] in /home/merefield/code/discourse-follow/app/controllers/follow/follow_controller.rb
5: def update
6: params.require(:username)
7: params.require(:follow)
8: byebug
9:
=> 10: raise Discourse::InvalidAccess.new unless current_user
11: raise Discourse::InvalidParameters.new if current_user.username == params[:username]
12:
13: if user = User.find_by(username: params[:username])
14: updater = Follow::Updater.new(current_user, user)
(byebug) current_user
nil
pfaffman
(Jay Pfaffman)
2021 年 8 月 23 日午後 12:22
7
そのユーザーを作成する、あの「あれ」は上にありますか?(何と呼ぶのか、正確にどうやるのかを思い出せるほど私は上手ではありません。ああ、ファブリケータですか?そのユーザーをファブリケートしたのですか?
(あるいは、私がスマホで見ているので見逃したのかもしれません)
「いいね!」 1
はい、ユーザーは正常に生成されています。ユーザーオブジェクトがインスタンス化されています。問題は sign_in メソッド内、あるいは環境に関連する部分にあるのでしょうか?(ただし、それは制御されているはずです)
「いいね!」 1
さらに調査したところ、以下の状況を確認しました。
def current_user(discourse/lib/auth/default_current_user_provider.rb at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub
@env.key?(CURRENT_USER_KEY) が true であるため、current_user は @env[CURRENT_USER_KEY] の値を取得します。
しかし、テスト実行中にコントローラーからこの行が呼び出された際、その値は nil になっています。
\n def update\n params.require(:username)\n params.require(:follow)\n\n raise Discourse::InvalidAccess.new unless current_user\n\
なぜユーザーを仕様内でサインインさせた後、@env[CURRENT_USER_KEY] が nil になるのか不明です。
テスト実行中は、1 つのテストの中で current_user が複数回呼び出されていることに気づきました。ある時点ではこの属性に値がありますが、すべての呼び出しで値があるわけではなく、また重要なタイミングでは値がありません。
david
(David Taylor)
2021 年 8 月 24 日午後 4:02
10
current_user オブジェクトに影響を与える可能性のある他のプラグインはインストールされていますか?私は discourse-follow をクローンして、その仕様が私の環境でも動作することを確認しました:
❯ LOAD_PLUGINS=1 bin/rspec plugins/discourse-follow/spec/requests/follow_controller_spec.rb
Randomized with seed 28704
...
Finished in 0.45075 seconds (files took 3.34 seconds to load)
3 examples, 0 failures
Randomized with seed 28704
「いいね!」 2
David、確認ありがとうございます!私の開発環境に何か特殊な問題があるに違いありませんね。
いいえ、他のプラグインはインストールされていません(バンドルされたものやデータエクスプローラーを除く)。しかし、あなたには動作しているとのことなので、新鮮でクリーンな Docker 開発環境を新たにセットアップして、そこで正常に実行できるか試してみようと思います。ありがとうございました!
「いいね!」 1
merefield
(Robert)
2021 年 8 月 25 日午前 10:35
12
はい、Docker 開発環境で動作しました:
d/rake plugin:spec["discourse-follow"]
ありがとうございます!!
「いいね!」 3
david
(David Taylor)
クローズされました:
2021 年 8 月 26 日午前 7:00
13
このトピックは20時間後に自動的に閉鎖されました。新しい返信は許可されていません。