如何使用RSpec

时间:2017-11-14 18:22:04

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

以下是我试图用RSpec测试的控制器方法

def login
    authorized_user = authenticate(params[:email], params[:password])
    if authorized_user
      # Creating a session if the User is Authorized
      session[:user_email] = authorized_user
      redirect_to(controller: 'home', action: 'details')
    else
      flash[:invalid] = 'Invalid Username or Password'
      redirect_to(action: 'signin')
    end
  end

def authenticate(email = '', password = '')
    url = 'http://localhost:8080/getUser/' + email
    response = RestClient.get(url)
    resp = JSON.parse(response)
    if resp[0]['id'] == 0
      return false  # If no user exists return false
    else
      return resp[0]['email']
    end
  end

这里我试图模拟RestClient.get()方法并将一个虚拟电子邮件返回到login方法以设置会话。 以下是我的spec文件

it "mocks the api method checks the user with a Invalid email" do
      RestClient.should_receive(:get).and_return('[{"id":"0"}]')
      get :authenticate
      expect(response).to redirect_to '/signin'
    end

但是我需要将电子邮件和密码传递给authenticate方法。我在这里遇到两个问题 1)如何将电子邮件和密码传递给authenticate方法 2)当我在没有上述参数的情况下调用authenticate方法时,我得到一个像这样的错误

Failure/Error: url = 'http://localhost:8080/getUser/' + email

     TypeError:
       no implicit conversion of nil into String

那么如何通过使用一些虚拟电子邮件和密码调用authenticate方法来模拟RestClient.get()方法并返回一些JSON作为响应?

1 个答案:

答案 0 :(得分:0)

在RSpec中,您可以将Hash方法中的参数作为get传递

get :show, email: 'abc@gmail.com', password: '1234567890'