Я большой нуб, когда дело доходит до тестирования или разработки, основанной на тестировании, поэтому я действительно борюсь с тестированием своего кода. Самая большая причина, почему такие ситуации ...
У меня есть модель, Photo
, в которой есть поля "место", "город", "штат" и "страна".
Я создал метод "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, откровенно говоря, намного больше, чем время, необходимое для тестирования этого в консоли.
Итак, у меня два вопроса:
- Конечно, есть лучший способ сделать это. Кто-нибудь может предложить рефакторинг?
- Является ли это соотношение тестового кода к коду модели нормальным, и если да, то почему оно стоит времени?
Спасибо !!
- РЕДАКТИРОВАТЬ -
Просто чтобы прояснить ситуацию, меня больше всего интересует рефакторинг кода теста , а не метод определения местоположения.