Rob*_*udi 2 ruby rspec ruby-on-rails rspec2 ruby-on-rails-3
我有当前的规格:
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
Run Code Online (Sandbox Code Playgroud)
我使用时示例失败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
Run Code Online (Sandbox Code Playgroud)
那么当我使用let时,为什么示例会失败?!
let
是懒惰评估的,直到你访问client
expect/lambda(+ 1)内的属性才会创建记录,但是它会立即被删除(-1),所以总体来说期望计数不会改变.
您可以使用let!
它来强制立即评估:
let!(:client) { create(:client) }
Run Code Online (Sandbox Code Playgroud)