Rspec:count应该已经改变了1,但被改为0

时间:2013-09-19 06:53:23

标签: ruby-on-rails ruby rspec

我是rspec测试的新手。我需要编写测试代码来创建新记录并检查计数是否为1.

我将rails与ios app集成。

在我的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,则测试正在通过。请让我知道,我正走在正确的道路上吗?如果没有,建议任何其他选择。

2 个答案:

答案 0 :(得分:1)

一些事情:

  1. 您的测试未提供params[:user][:name]的值,因此@name为零,因此永远不会到达User.new的行。
  2. 您实际上从未保存过您实例化的用户,这意味着User.count永远不会更改。
  3. @name变量实际上不是名称,而是User个实例(如果找到)。
  4. 您可能希望使用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)
    

答案 1 :(得分:0)

unless @name
  user = User.new("email" => params[:user][:email])        
end