2

次のコードを持つ ArticleController があります。

def edit
  @article = current_user.articles.find(params[:id])
end

そして、次のテスト:

describe "GET 'edit'" do
  it "should fail when signed in and editing another user article" do
    sign_in @user
    get :edit, :id => @another_user_article.id
    response.should_not be_success
  end
end

ただし、テストを開始すると、次のエラーが表示されます (これは正常です) が、テストに合格するにはどうすればよいでしょうか?

Failure/Error: get :edit, :id => @another_user_article.id
Mongoid::Errors::DocumentNotFound:
   Document not found for class Article with id(s) 4f9e71be4adfdcc02300001d.

これでコントローラーメソッドを変更することを考えましたが、それは私には正しくないようです:

def edit
  @article = Article.first(conditions: { _id: params[:id], user_id: current_user.id })
end
4

2 に答える 2

5

この状況でコードが行うべき正しいことは例外を発生させることであると判断できるため、仕様を次のように変更します。

expect { get :edit, :id => @another_user_article.id}.to raise_error(Mongoid::Errors::DocumentNotFound)

または、この場合にコントローラーが行うべきことは、明示的に 404 をレンダリングすることであると判断できます: コントローラー レベルで (アクションまたは を介し​​てrescue_from) 例外をレスキューします。この場合、仕様はそのまま通過する必要があります。

于 2012-04-30T11:36:19.507 に答える
0

ここでは、オブジェクト @another_user_article を作成していません。最初に another_user_article モデルのフィクスチャをロードしてから、シナリオの一部の前にこのオブジェクトを作成します。

于 2012-04-30T11:23:00.450 に答える