[英]setting up objects for model testing with factory_girl
我想测试以下范围,但不知道如何正确设置测试对象。 我什至不知道我是否应该在工厂中通过一些关联或使用let / local vars创建它们。
task.rb
belongs_to :assigner, class_name: "User"
belongs_to :executor, class_name: "User"
scope :completed, -> { where.not(completed_at: nil) }
scope :uncompleted, -> { where(completed_at: nil) }
scope :alltasks, -> (u) { where('executor_id = ? OR assigner_id = ?', u.id, u.id) }
scope :between, -> (assigner_id, executor_id) do
where("(tasks.assigner_id = ? AND tasks.executor_id = ?) OR (tasks.assigner_id = ? AND tasks.executor_id = ?)", assigner_id, executor_id, executor_id, assigner_id)
end
工厂
factory :task do
content { Faker::Lorem.sentence }
deadline { Faker::Time.between(DateTime.now + 2, DateTime.now + 3) }
association :executor, factory: :user
association :assigner, factory: :user #I guess this is not right
end
factory :user do
sequence(:email) { |n| "example#{n}@gmail.com" }
password 'example0000'
password_confirmation 'example0000'
new_chat_notification { Faker::Number.between(0, 10) }
new_other_notification { Faker::Number.between(0, 10) }
end
task_spec.rb
describe Task do
.....
describe "scopes" do
#I DON'T KNOW HOW TO SETUP THE TEST OBJECTS PROPERLY
let(:uncompleted_task) { create(:task) }
let(:completed_task) { create(:task, completed_at: DateTime.now - 2) }
let(:user) { create(:user)
let(:task_1) { create(:task, executor_id: user.id, assigner_id: (user.id + 1)) }
let(:task_2) { create(:task, assigner_id: user.id, executor_id: (user.id + 1) }
let(:task_3) { create(:task, assigner_id: user.id, executor_id: (user.id + 2) }
it "completed" do
expect(completed_task).to eq(Task.completed.first)
end
it "uncompleted" do
expect(uncompleted_task).to eq(Task.uncompleted.last)
end
it "alltasks" do
end
it "between" do
end
end
end
首先,由于以下原因,我不想在工厂中建立关联:
要测试范围,您应该遵循一些最佳实践:
between
如果需要,范围小的。 顺便说一句,您可能会误解let
的用法,只有在测试用例中调用对象时,才会创建let定义的对象。 在您的原始规格中,不会创建任何任务或用户,因为不会调用任何任务或用户。 要执行所需的操作,应改用before
块。
对于您的示例,我将在下面创建工厂和规格:
工厂工厂
factory :task do
content { Faker::Lorem.sentence }
deadline { Faker::Time.between(DateTime.now + 2, DateTime.now + 3) }
end
factory :user do
sequence(:email) { |n| "example#{n}@gmail.com" }
sequence(:password) { |n| "password#{n}" }
password_confirmation { password }
new_chat_notification { Faker::Number.between(0, 10) }
new_other_notification { Faker::Number.between(0, 10) }
end
眼镜
describe Task do
# ...
describe "scopes" do
let(:executor) { create(:user) }
let(:assigner) { create(:user) }
describe "completeness related" do
before(:example) do
@uncompleted_task = create(:task, executor: executor, assigner: assigner)
@completed_task = create(:task, executor: executor, assigner: assigner, completed_at: DateTime.now - 2))
end
it "completed" do
expect(Task.completed).to include(@completed_task)
expect(Task.completed).not_to include(@uncompleted_task)
end
it "uncompleted" do
expect(Task.uncompleted).to include(@uncompleted_task)
expect(Task.uncompleted).not_to include(@completed_task)
end
end
it "alltasks" do
me = create(:user)
owned_task = create(:task, executor: me, assigner: assigner)
assigned_task = create(:task, executor: executor, assigner: me)
not_my_task = create(:task, executor: executor, assigner: assigner)
expect(Task.alltasks(me)).to include(owned_task, assigned_task)
expect(Task.alltasks(me)).not_to include(not_my_task)
end
it "between" do
# ... (there should be as last 5 tasks to create)...
end
end
# ...
end
在“ Rails 4测试处方-Noel Rappin构建健康代码库”一书中,有更多关于如何编写测试的详细信息和热门信息,如果您有兴趣的话,值得阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.