无法解决此错误。我不确定controller_spec的哪一部分写得错误。请帮忙!
路线
Rails.application.routes.draw do
resources :cases, only: [:index, :show, :new, :create, :edit, :update] do
resources :links, only: [:create, :destroy]
end
end
控制器
class LinksController < ApplicationController
before_action :prepare_case
def destroy
@link = @case_file.links.find(params[:id])
@link.destroy
redirect_to case_path(@case_file)
end
private
def prepare_case
@case_file = CaseFile.find(params[:case_id])
end
end
规范/工厂
FactoryGirl.define do
factory :link do
case_file
url 'www.google.com'
trait :invalid do
case_file nil
url ''
end
end
end
规格/控制器
require 'rails_helper'
RSpec.describe LinksController, type: :controller do
let(:user) { build(:user) }
before { login_user user }
#for user log in
let(:case_file) { create(:case_file) }
let(:link) { create(:link, case_file: case_file) }
describe "DELETE destroy" do
it "deletes a link" do
expect { delete :destroy, id: link.id , case_id: case_file }.
to change(Link, :count).by(-1)
expect(response).to redirect_to(case_path(case_file))
end
end
end
错误消息
$ rspec spec / controllers / links_controller_spec.rb ... F
故障:
1)LinksController DELETE destroy删除链接 故障/错误: expect {delete:destroy,id:link.id,case_id:case_file}。 改变(链接,:计数).by(-1)
预期#count已更改为-1,但已更改为0 './spec/controllers/links_controller_spec.rb:28:in'块(3级)in'
在1.18秒内完成(文件加载时间为5.03秒) 4个例子,1个失败
失败的例子:
rspec ./spec/controllers/links_controller_spec.rb:27#LinksController DELETE destroy删除链接
答案 0 :(得分:5)
这是一个经典错误(虽然我找不到好的复制品)。当您使用let
时,rspec仅在您创建Link
对象的情况下执行关联的块,当您第一次引用它时。
结果,链接在传递给expect
的块中被创建和销毁:计数没有改变,测试失败。
您需要做的就是参考测试前面的link
。如果您使用link
而不是let!
,那么rspec将在示例运行并且测试通过之前创建对象,而不是仅在测试中的某个位置添加随机调用let
。这和做
before(:example) { link }
答案 1 :(得分:1)
我发现你的答案非常有用。我找到了关于let和let的差异的更多信息! here。这里的关键是let是懒惰评估的。
在这种情况下,我会使用let!所以你不需要手动调用方法。