2

示唆しているスタックオーバーフローの古い投稿を見つけましたmodel_entity.send(:before_create)が、今は機能しません。では、実行するメソッドをテストするにはどうすればよいですか。before create, update, destroy別の投稿がありますが、私の場合はどうすればよいのかわかりません。

class User < ActiveRecord::Base

  before_create do |user|
    user.secure_token = UUID.new.generate
  end
end

ポイントは、このコードを使用してメソッドを作成し、それを呼び出すことができるということです。他の方法はありますか?

一般に、自分のモデルにしかない after_create メソッドをテストしたい場合は、モデル オブジェクトを作成してチェックする必要があります。でも、それは必要のない行動だと思います。インスタンスを作成せずに、このメソッドをチェックすることができました。

4

3 に答える 3

5

これを行うドライな方法があります:

expect{ user.save }.to change{ user.secure_token }
于 2014-02-21T01:09:23.557 に答える
3

ちょっとトリッキーなものを見つけました。実際の結果を検証する必要がある場合は、個別に検証して:secure_token=ください.should_receive(:secure_token=)。. 例:

上記のモデル:

describe "verifies that secure_token= is called" do
  @user = User.new
  @user.should_receive(:secure_token=)
  @user.save
end

describe "verifies the result is set" do
  @user = User.new
  @user.save
  expect(@user.secure_token).not_to be_empty
end

ただし、should_receive と同じテストで空でないことを期待すると、テストは失敗します。

于 2013-02-20T12:43:45.953 に答える
2

rspec を使用している場合は、次のことができると思います。

@user = User.new
@user.should_receive(:secure_token)
@user.save
于 2012-09-18T17:11:28.753 に答える