在let()中使用哈希

fre*_*gel 2 ruby rspec ruby-on-rails

我试图通过将一个哈希放入一个let并只调用let来干我的代码,但它似乎不起作用.我收到这些错误:

syntax error, unexpected =>, expecting '}' (SyntaxError) "email" => user.email,

syntax error, unexpected =>, expecting :: or '[' or '.' ...l" => user.email, "password" => user.password }
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

describe '#create' do
  let(:user) { create(:user) }
  let(:user_params) { "email" => user.email, "password" => user.password }
  before(:each) { User.stub(:find_by_email).and_return(user) }
  it "should send find message to user model" do
    User.should_receive(:find_by_email)
    post :create, locale: "es", user: { user_params }
  end
  it "should set user to @user" do
    post :create, locale: "es", user: { "email" => user.email, "password" => user.password }
    assigns(:user).should eq(user)
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

def create
  @user = User.find_by_email(params[:email])
  if @user && @user.authenticate(params[:password])
    session[:user_id] = @user.id
    redirect_to root_url
  else
    render 'login'
  end
end
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 15

你错过了一对牙套.

let(:user_params) { "email" => user.email, "password" => user.password }
Run Code Online (Sandbox Code Playgroud)

应该

let(:user_params) { {"email" => user.email, "password" => user.password} }
Run Code Online (Sandbox Code Playgroud)


mar*_*nja 9

我更喜欢更长的解释.当你写这样的东西:

let(:user_params) { "email" => user.email, "password" => user.password }
Run Code Online (Sandbox Code Playgroud)

let使用一个参数(:user_params)和一个块(在本例中{ "email" => user.email, "password" => user.password })调用方法.我会再说一遍:

let(:something) { some_method_call }
Run Code Online (Sandbox Code Playgroud)

let(:something) do
  some_method_call
end
Run Code Online (Sandbox Code Playgroud)

是平等的.通过使用let,RSpec将变量设置为块结果.所以,在块内,你需要返回一些东西.在这种情况下 - 哈希:

let(:user_params) do 
  { "email" => user.email, "password" => user.password }
end
Run Code Online (Sandbox Code Playgroud)

而已!您可以在APIdock上找到有关let的更多信息