在 let() 函数中使用哈希表

7

我试图通过将哈希表放入let中并仅调用let来DRY化我的代码,但似乎无效。我得到以下错误:

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

syntax error, unexpected =>, expecting :: or '[' or '.' ...l" => user.email, "password" => user.password }

这是我的测试:

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

这是我的代码:

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
2个回答

26

你少写了一对大括号。

let(:user_params) { "email" => user.email, "password" => user.password }

应该是

let(:user_params) { {"email" => user.email, "password" => user.password} }

9
我希望你能提供更详细的解释。 当你写下这样的内容时:
let(:user_params) { "email" => user.email, "password" => user.password }

您调用了带有一个参数 (:user_params) 和一个块的 let 方法 (在这种情况下为 { "email" => user.email, "password" => user.password })。我再说一遍:

let(:something) { some_method_call }

并且

let(:something) do
  some_method_call
end

使用let关键字,RSpec会将变量设置为块的结果。因此,在块内部,您需要返回一些内容。在这种情况下,返回哈希表:

let(:user_params) do 
  { "email" => user.email, "password" => user.password }
end

就是这样!你可以在 APIdock 上了解更多关于 let 的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接