【发布时间】:2018-02-08 21:01:55
【问题描述】:
我如何在我的 Rails 应用程序中使用 RSpec 进行这样的测试:
describe "POST create" do
describe "if we have a logged in user and he can be an owner" do
describe "and if params are valid" do
let!(:service_attributes_with_categories_1_and_2) {
FactoryBot.attributes_for :service_with_categories_1_and_2
}
let!(:category_1) { FactoryBot.create :category, {id: 1} }
let!(:category_2) { FactoryBot.create :category, {id: 2} }
it "creates a new service" do
# ...
end
it "creates associations with categories" do
# ...
end
end
describe "and if categories are not valid" do
# ...
end
describe "and if some common service params are not valid" do
# ...
end
end
describe "if no user is logged in, but params are valid" do
let!(:service_attributes_with_categories_1_and_2) {
FactoryBot.attributes_for :service_with_categories_1_and_2
}
let!(:category_1) { FactoryBot.create :category, {id: 1} }
let!(:category_2) { FactoryBot.create :category, {id: 2} }
it "doesn't create a new service" do
# ...
end
it "doesn't create associations with categories" do
# ...
end
end
describe "if logged user cannot be an owner, but params are valid" do
let!(:service_attributes_with_categories_1_and_2) {
FactoryBot.attributes_for :service_with_categories_1_and_2
}
let!(:category_1) { FactoryBot.create :category, {id: 1} }
let!(:category_2) { FactoryBot.create :category, {id: 2} }
it "doesn't create a new service" do
# ...
end
it "doesn't create associations with categories" do
# ...
end
end
end
正如我们所看到的,我有许多多余的 let! 方法调用,但我不知道如何让它 DRY。我不能只定义普通方法,因为在这种情况下,变量将仅在此方法的范围内可用。我也不能让我的类别在一般范围内创建,因为在两种情况下,由于测试性质,它们不应该被创建。那么,技术上我应该怎么做呢?
【问题讨论】:
-
有什么理由为什么在
describe "POST create" do下的顶级范围内声明它们一次不起作用? -
是的,因为在某些情况下我不喜欢在数据库中创建我的类别。
-
还有更多你没有展示的测试吗?根据您展示的内容,您有三个测试,每个测试都设置相同的测试数据。为什么不在你做出断言之前设置一次呢?
-
你说的不对。第一组
let!调用在"and if params are valid"范围内定义,而我们在"and if categories are not valid"和"and if some common service params are not valid"范围内没有定义。 -
调整范围,使前两个范围是“如果参数有效”(这些
lets 被声明)与“如果参数无效”(它们不是)和所有其他范围在这些范围内。
标签: ruby-on-rails rspec dry