0

rspec は初めてで、validates_associated の期待値をどのように記述すればよいか疑問に思っています。

post.rb

class Post
  validates_associated :user
end

post_spec.rb

it 'must belong to a user' do
  post = build(:post, user: nil)
  expect(post).to have(1).errors_on(:user)
end

ただし、これは機能せず、error_on(:user_id) のチェックも行いません

4

2 に答える 2

1
class Post
  validates_associated :user
end

class User
  validates :name, presence:true
end

実際に関連する手段を例で検証します

post = Post.find 1

post.title = "something"
post.user.name =  nil

post.save => false

ユーザーの名前が存在しないため、関連付けられたユーザーが無効であるため、false が返されます。

テストするには、次のことを行う必要があります。

it 'validates associated user' do
  post = build(:post)
  post.user.build(:name => nil)
  post.save.should == false
  post.user.errors.should == {:name => [name must be present]} // something like this
end
于 2013-06-29T06:22:32.233 に答える
0

RSpec を使用する方法はたくさんありますが、最近のアプローチからshouldtoへの移行を考えると特にそうです。expectこの回答では、これらの特定の引数で呼び出されたビルドが実際にエラーを発生させると仮定して、テストがそのまま機能しない理由に対応しようとします。つまり、あなたのテストの形に応えようとします。

まず、あなたの発言の意図がよくわかりませんpost = build(...)。その時点でビルド メソッドを実際に実行するつもりで、ビルドの実行が失敗すると予想される場合、テストが失敗する原因になります。エラーの発生をテストするには、エラーを発生させるコードを RSpec に渡し、RSpec がそれを呼び出せるようにする必要があります。一般に、テスト対象のコードを実行する前に期待を設定します。

build を呼び出す関数としてpost = build(...)定義することを期待していた場合、それは正しい構文ではありません。postこのアプローチを使用したい場合は、post = lambda {build(...)}. これにより、expectメソッドを実行postして、それによって発生したエラーを調べることができます。

または、次のようにブロックを直接 expect に渡すこともできます。

expect{build(...)}.to ...

その他の例については、 https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/expect-errorを参照してください。

于 2013-06-29T17:32:03.593 に答える