1

私はrspecテストが初めてです。新しいレコードを作成し、カウントが 1 であることを確認するテスト コードを作成する必要があります。

RailsをiOSアプリと統合しています。

私の registration_controller で

@name = User.find_by_name(params[:user][:name]])
#params[:user][:name]] value from ios app
if !@name.nil?
    user = User.new("email" => params[:user][:email])        
end

私の registration_controller_spec で

 expect {
        post :create, {:user => { 'email' => 'xxx@yyy.com'}}
    }.to change(User, :count).by(1)

コントローラーの if 条件により、テストに合格できません。

Failure/Error: expect {
   count should have been changed by 1, but was changed by 0

コントローラーの @name にサンプル値を割り当てると、テストに合格します。教えてください、私は正しい道を進んでいますか?そうでない場合は、他の代替案を提案してください。

4

2 に答える 2

1

いくつかのこと:

  1. あなたのテストは の値を提供していないため、params[:user][:name]nil@nameであるため、 の行にUser.newは到達しません。
  2. インスタンス化したユーザーを実際に保存することはありません。つまり、User.count変更されることはありません。
  3. 変数は@name実際には名前ではなく、Userインスタンス (見つかった場合) です。

User.find_or_create_byおそらくYevgeniyが言及したように使用したいと思うでしょう。これは、次のようなことを意味します。

user = User.find_or_create_by(:name => params[:user][:name]) do |user|
  user.email = params[:user][:email]
end

そして、それが実際に機能するためには、おそらくテストに読み取りが必要です

expect {
  post :create, {:user => {'name' => 'Mr. xxx', 'email' => 'xxx@yyy.com'}}
}.to change(User, :count).by(1)
于 2013-09-19T07:53:54.757 に答える
0
unless @name
  user = User.new("email" => params[:user][:email])        
end
于 2013-09-19T06:58:52.490 に答える