使用Rspec测试具有局部变量的控制器

时间:2012-04-20 16:04:48

标签: ruby-on-rails ruby rspec mocking stub

我是Rspec的新手,也是RoR的新手。话虽如此,我已经用尽所有选择试图让它发挥作用。我的方法中有一个变量,用于在User的{​​{1}}操作中创建create。此变量从身份验证方法获取数据。然后,我使用这个局部变量,它是API调用的响应,根据变量参数创建用户。我已经尝试了一切我对Rspec的了解,这并不算多,没有运气。因为我存根/模拟方法和变量,因为数据变量为零,我不断收到错误。

如果有人可以帮我弄清楚如何测试这个或者把我链接到一个很好的教程(我已经阅读了一堆)关于如何做到这一点,我会真的很好看。

这是我的代码:

users_controller.rb

UserController.rb

users_controller_spec.rb

def get_google_data
  ...
  data = response.parsed #OAuth2 

  @id = data['id']
  @email = data['email']
  @fname = data['given_name']
  @lname = data['family_name']
end

def create
  get_google_data
  puts "Got google data"
  puts @id
  if !@id.nil?
    puts "data is not nil"
    @user = User.find_by_google_id(@id)
    puts @user

    if @user.nil?
      puts "inside user condition"
      @user = User.new(:email => @email, :google_id => @id,
                       :first_name => @fname,
                       :last_name => @lname)

      if @user.save
        render json: @user, status: :created, location: @user
      else
        render json: @user.errors, status: :unprocessable_entity
      end
    else
      puts "ended in the right Place"
      render json: @user, location: @user
    end
  end
end

我有2个问题。

  1. 测试失败,因为我无法控制describe "should not create duplicate user" do it "returns user object that was previously created" do @user = mock_model(User, :google_id=>1) #controller.should_receive(:get_google_data).and_return(:true) controller.instance_variable_set(:@id, 1) User.stub!(:find_by_google_id).with(1).and_return(@user) post :create @user.should_not be_nil end end 中的数据以及以下分配。

    data['id']
  2. 返回Failure/Error: post :create NoMethodError: undefined method `[]' for nil:NilClass # ./app/controllers/users_controller.rb:109:in `get_google_data' # ./app/controllers/users_controller.rb:118:in `create' # ./spec/controllers/users_controller_spec.rb:6:in `block (3 levels) in <top (required)>' 的调用给了我一个循环引用错误:

    @user

0 个答案:

没有答案