我是FactoryGirl
# App.rb
belong_to :plan
# Plan.rb
has_many :apps
的新手,在我的Rails应用中,我的关系看起来像这样:
before_save :set_default_plan, on: :create
每个应用都必须有一个计划,在我的App.rb模型中,我这样做:require "rails_helper"
include Warden::Test::Helpers
Warden.test_mode!
describe "adding apps" do
let(:user) { FactoryGirl.create(:user) }
before { login_as(user, scope: :user) }
it "allows a user to create an app" do
visit apps_path
fill_in "App name", with: "My App"
click_on "create_app_button"
visit apps_path
expect(page).to have_content("My App")
end
end
。
我想使用Capybara集成测试来测试应用创建是否有效。我目前有一个看起来像这样的测试:
#{app.plan.free_requests}
创建应用后,我在视图中呈现此内容:bundle exec rspec
。如果我使用undefined method `free_requests' for nil:NilClass
运行我的测试,我目前会收到此错误:
FactoryGirl.define do
factory :app do
name "Test"
[...]
association :plan, :factory => :plan
end
end
FactoryGirl.define do
factory :plan do
name "Default"
[...]
end
end
在我的应用程序中,我也使用FactoryGirl来测试我的模型。我有以下(相关)工厂:
set_default_plan
我想知道如何设置我的工厂和测试套件,使这个测试成为一个绿色测试。
我可以为应用程序分配计划吗?我会以某种方式创建Capybara,或者我可以使用FactoryGirl为我的应用程序创建默认关联/计划。还有另一种方法吗?感谢所有的帮助。
更新
这是# App.rb
def set_default_plan
if self.new_record?
plan = Plan.find_by_stripe_id("default_plan")
if plan.nil? == false
self.plan = plan
end
end
end
方法的外观:
{{1}}
答案 0 :(得分:2)
FactoryGirl实际上不应该与测试中的“应用”或“计划”有任何关系,因为您正在通过控制器创建操作,除非set_default_plan
实际上没有创建计划存在。如果是这种情况,那么您可以使用FactoryGirl创建所需的计划,如前一个块中的FactoryGirl.create(:plan)
您还应该指定该计划是必需的关联(这在Rails 5中是默认的,因此如果您使用它可能没有必要),这将阻止您的应用程序在没有计划的情况下创建。
# App.rb
belongs_to :plan, required: true
另外需要注意的是,在访问其他页面之前,单击执行操作的按钮后,应始终检查确认。这是因为单击按钮的结果不保证是同步的,因此立即访问其他页面可能会终止操作请求。
click_on "create_app_button"
expect(page).to have_content("App Created!!!") # whatever text is shown on success
visit apps_path