Rails Rspec 和 Foreign Key 的问题

linjunpop · 2012年03月27日 · 最后由 linjunpop 回复于 2012年03月28日 · 2726 次阅读

Spec:

require 'spec_helper'

describe CameraReport do

  let(:call_sheet) { create(:call_sheet) }
  let(:camera_report) { create(:camera_report, call_sheet: call_sheet) }
  subject { camera_report }

  describe "associations" do
    it { should belong_to(:call_sheet) }
    it { should have_many(:camera_logs).dependent(:destroy) }
  end

  describe "validations" do
    it { should_not allow_mass_assignment_of(:call_sheet_id) }
    it { should validate_presence_of(:date) }
  end

end


Factory:

FactoryGirl.define do
  factory :call_sheet do
    company_name "company"
    association :draft
    association :stage
    association :category
  end

  factory :camera_report do
    shoot_day 1
    association :call_sheet
  end
end


这个测试 花费了 20 多秒,如果把 call_sheet 换成 let(:call_sheet) { build_stubbed(:call_sheet) } 数据库会报错,因为有 foreign_key call_sheet_id

如果数据库中没有 foreign_key,就可以把 call_sheet 用 stubbed 代替,测试时间大概 0.x 秒

问题是 我应该保留数据库中的 foreign_key 么?还是我测试的写法有问题?怎样做可以使测试不至于如此慢?

感觉你是在测试 active record

楼主写的这些似乎直接用 shoulda 就可以了

这些语句就是 shoulda @ywencn

and 可能我没有表达清楚, 我的问题是怎么让测试不至于如此耗费时间

因为 CameraReportcall_sheet_id 的 foreign key, 所以我要测试 CameraReport 的时候,就必需要创建一个 CallSheet,而因为 CallSheet 又和其他 model 有 association,所以每次测试 CameraReport 就必需创建一大堆的真实对象,但是这些对象在 CameraReport 的测试里,我并不关心,所以我希望可以用 stubbed 的对象,但是因为存在 foreign key,如果我用 stubbed 的对象,数据库就会报错。

let(:camera_report) { create(:camera_report, call_sheet: nil) }

不过这样的话

it { should belong_to(:call_sheet) }

这句会不会测试不通过就不晓得了,未测试

测试嘛,费时间就费了哈,实在不行换配置高的机器,太在意这个反而会导致测试不完全

发完了再看下,觉得怪怪的,不都是下面这样写吗?

let(:camera_report) { Factory(:camera_report, call_sheet: nil) }

#4 楼 @vkill Thank you. 只是测试实在慢的不行。。

关于语法:

http://robots.thoughtbot.com/post/19412394597/factory-girl-hits-3-0

需要 登录 后方可回复, 如果你还没有账号请 注册新账号