gpt4 book ai didi

ruby-on-rails - RSpec 重构帮助

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:06 25 4
gpt4 key购买 nike

在测试或测试驱动开发方面,我是一个大菜鸟,所以我真的很难测试我的代码。最大的原因是这样的情况......

我有一个模型,Photo,它有字段“place”、“city”、“state”和“country”。

我创建了一个方法“location”,它可以接受一个参数,并将返回最小形式、缩写形式或完整形式的位置。这是模型代码:

def location( form=:full )
usa = country.eql?('US') || country.eql?('United States')
country_name = Carmen::country_name( self.country )

if self.state.present?
state_name = Carmen::state_name( self.state )
end

case [form, usa]
when [:min, true] then ( self.city.blank? ? self.place : self.city )
when [:min, false] then ( self.city.blank? ? self.place : self.city )
when [:short, true] then [ ( self.city.blank? ? self.place : self.city ), state_name ].join(', ')
when [:short, false] then [ ( self.city.blank? ? self.place : self.city ), country_name ].join(', ')
when [:full, true] then [ self.place, self.city, state_name ].delete_if{|a| a.blank? }.join(', ')
when [:full, false] then [ self.place, self.city, country_name ].delete_if{|a| a.blank? }.join(', ')
else raise "Invalid location format"
end
end

如您所见,它相当简洁明了。现在,这是我的规范:

describe "location" do

before do
@us = Photo.new(:place => "Main St.", :city => "Barville", :state => "TX", :country => "US")
@uk = Photo.new(:place => "High St.", :city => "Barchester", :country => "GB")
@it = Photo.new( :place => "il Commune", :city => "Baria", :state => "AR", :country => "IT" )
end

context "minimum form" do
it "should return city or place for US Photos" do
@us.location(:min).should == "Barville"
@us.city = ""
@us.location(:min).should == "Main St."
end

it "should return city or place for Internationals without states" do
@uk.location(:min).should == "Barchester"
@uk.city = ""
@uk.location(:min).should == "High St."
end

it "should return city or place for Internationals with states" do
@it.location(:min).should == "Baria"
@it.city = ""
@it.location(:min).should == "il Commune"
end
end

context "short form" do
it "should return city,state or place,state for US photos" do
@us.location(:short).should == "Barville, Texas"
@us.city = ""
@us.location(:short).should == "Main St., Texas"
end

it "should return city,country or place,country for Internationals without states" do
@uk.location(:short).should == "Barchester, United Kingdom"
@uk.city = ""
@uk.location(:short).should == "High St., United Kingdom"
end

it "should return city,country or place,country for Internationals with states" do
@it.location(:short).should == "Baria, Italy"
@it.city = ""
@it.location(:short).should == "il Commune, Italy"
end
end

context "full form" do
context "US Photos" do
it "should return place, city, state" do
@us.location(:full).should == "Main St., Barville, Texas"
end

it "should return place, state if city is blank" do
@us.city = ""
@us.location(:full).should == "Main St., Texas"
end

it "should return city, state if place is blank" do
@us.place = ""
@us.location(:full).should == "Barville, Texas"
end
end

context "Internationals without states" do
it "should return place, city, state" do
@uk.location(:full).should == "High St., Barchester, United Kingdom"
end

it "should return place, state if city is blank" do
@uk.city = ""
@uk.location(:full).should == "High St., United Kingdom"
end

it "should return city, state if place is blank" do
@uk.place = ""
@uk.location(:full).should == "Barchester, United Kingdom"
end
end
end

context "Internationals with states" do
it "should return place, city, state" do
@it.location(:full).should == "il Commune, Baria, Italy"
end

it "should return place, state if city is blank" do
@it.city = ""
@it.location(:full).should == "il Commune, Italy"
end

it "should return city, state if place is blank" do
@it.place = ""
@it.location(:full).should == "Baria, Italy"
end
end
end

所以,98行测试代码测试17行模型代码。这对我来说太疯狂了。此外,坦率地说,在 RSpec 中测试它所花费的时间比在控制台中测试它所花费的时间要多得多。

所以,我有两个问题:

  1. 当然有更好的方法来做到这一点。谁能建议重构?
  2. 测试代码与模型代码的比例是否正常?如果是,为什么值得花时间?

谢谢!!

-- 编辑--

需要说明的是,我最感兴趣的是重构测试代码,而不是定位方法。

最佳答案

我发现高测试/代码比率是完全正常的,甚至是需要的。一般来说,测试代码应该比普通代码更“解开”。它们被称为示例是有原因的:测试应该向人们展示如何使用您的代码,而最好的方法是每个示例都非常简单。

编写相对冗长的测试还可以帮助您避免调试它们。测试应该简单易读,而不是紧凑高效。当您不必首先弄清楚任何复杂的循环、迭代、递归或元编程时,就更​​容易理解每​​个测试在做什么。

也就是说,您应该始终警惕寻找可以放置在 before(:each) block 中的代码段。看起来你们在这方面都做得很好。

关于ruby-on-rails - RSpec 重构帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5407920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com