私はRSpecをLeadsコントローラ仕様と書いています。その中で、私はリードコントローラのアクションを作成するためのテストを書いています。今度は私のリードコントローラーがProjectモデルを呼び出して、Contactオブジェクトを作成してプロジェクトに割り当てるオブジェクト(Project)を作成します。私のプロジェクトモデルがContactオブジェクトを作成するかどうかをテストしようとすると、テストは失敗します。私は私の連絡先オブジェクトが作成取得されていない理由を知っていない:(Rspecの2つのオブジェクトの間に関係を確立できません
マイleads_controller_spec.rb
describe "POST #create" do
it "should create a contact too" do
my_lead = Fabricate(:project, id: Faker::Number.number(10))
expect{
post :create, project: my_lead.attributes
}.to change(Contact, :count).by(1)
end
it "should be equal to last created contact" do
my_lead = Fabricate(:project, id: Faker::Number.number(10))
post :create, project: my_lead.attributes
expect(Project.last.contact).to eq(Contact.last)
end
end
leads_controller.rb
def create
if @lead = Project.add_new_lead(lead_params)
@lead.create_activity :create_new_lead, owner: current_user
puts "My lead in create action: #{@lead.inspect}"
else
respond_to do |format|
format.html { redirect_to :back, :alert => "Email is already Taken"}
end
end
respond_to do |format|
format.html { redirect_to leads_path }
end
end
Project.rb
def add_new_lead(inputs, data = {})
if !Contact.where(email: inputs[:email]).present?
contact = Contact.create(phone: inputs[:phone], email: inputs[:email], fullname: inputs[:fullname])
project = Project.create(name: inputs[:fullname], flat_status: inputs[:flat_status], flat_type: inputs[:flat_type], flat_area: inputs[:area], location: inputs[:locality], address: inputs[:site_address], customer_type: inputs[:customer_type])
project.contact = contact
project.save
project
else
return nil
end
end
contact_fabricator.rb
require 'faker'
Fabricator(:contact) do
email { "email_#{Kernel.rand(1..30000)}@prestotest.com" }
fullname "project#{Kernel.rand(1..30000)}"
address "address#{Kernel.rand(1..30000)}"
end
project_fabricator.rb
require 'faker'
Fabricator(:project) do
contact
end
contact.rb
field :phone, type: String
field :email, type: String
field :fullname, type: String
field :status, type: String, default: "DEFAULT"
field :address, type: String
field :new_address, type: String
field :other_data, type: Hash, default: {}
validates_presence_of :email
validates_uniqueness_of :email, :message => "Email already taken"
失敗メッセージ:#countが1で変更されていると予想、しかし0 – user191990
によって変更されたテストは、新しい '連絡先を作成しなかったこと、それは可能です'一致する連絡先が既にデータベースに存在していたか、または検証が失敗したためですか?テストスイートを2回実行する間にデータベースを削除しますか? 'Contact'モデルの検証はありますか? – spickermann
はいspickermann私はContact.rbファイルの最後の2行を見ることができるので、Contactモデルへのバリデーションを持っています。しかし、私が検証を取り除くと、テストは緑色になりますが、とにかく検証が必要です。 – user191990