【问题标题】:RSpec: Why doesn't let work but before(:each) does?RSpec:为什么不让工作,但 before(:each) 呢?
【发布时间】:2012-04-19 22:28:40
【问题描述】:

我有当前的规格:

describe "DELETE 'destroy'" do
  let(:client) { create(:client) }

  #before(:each) do
    #@client = create(:client)
  #end

  it "should delete a client" do
    expect {
      delete :destroy, :id => client
    }.to change(Client, :count).by(-1)
  end

  # ...

end

当我使用let 时示例失败,但当我使用before(:each) 时工作正常。

下面是实现代码:

def destroy
  client = Client.find(params[:id])
  if client.destroy
    flash[:success] = "Client deleted successfully"
    redirect_to kong_clients_url
  else
    flash[:error] = "Client not deleted for some reason"
    redirect_to kong_clients_url
  end
end

那么为什么当我使用 let 时示例会失败?!

【问题讨论】:

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


    【解决方案1】:

    let 是惰性求值的,在您访问 expect/lambda (+1) 内的 client 属性之前不会创建记录,但随后它会立即被删除 (-1),因此总体上在预期范围内计数不变。

    您可以使用let! 强制它立即进行评估:

    let!(:client) { create(:client) }
    

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多