ruby-on-rails - RSpec:为什么不让 work 而 before(:each) 呢?

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

我有当前规范:

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 时示例会失败?!

最佳答案

let 是延迟求值的,直到您访问 expect/lambda (+1) 中的 client 属性才会创建记录,但随后它会立即被删除(-1),所以总的来说在期望值内计数不会改变。

您可以使用 let! 强制它立即求值:

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

关于ruby-on-rails - RSpec:为什么不让 work 而 before(:each) 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237763/

相关文章:

ruby-on-rails - Windows 上的 Docker 获取 "Could not locate Gemfile"

ruby-on-rails - 无法解密 config/credentials.yml.enc

ruby - "Missing master key"使用密码箱

ruby-on-rails - 从一个模型访问另一个模型

ruby-on-rails - 使用 Roo 和 Ruby(Rails) 解析 Excel

ruby - 管道程序窗口立即关闭

ruby-on-rails - Rspec 测试比较<=>

jquery - Rails 3 - 如何使用 Jquery 基于选定的 div 动态渲染单个对象的部分?

ruby-on-rails - 名称修复/验证?

ruby-on-rails - 在 Redmine 中自动创建自定义字段