Я использую scaffolding для генерации тестов контроллера rspec. По умолчанию он создает тест как:
let(:valid_attributes) {
skip("Add a hash of attributes valid for your model")
}
describe "PUT update" do
describe "with valid params" do
let(:new_attributes) {
skip("Add a hash of attributes valid for your model")
}
it "updates the requested doctor" do
company = Company.create! valid_attributes
put :update, {:id => company.to_param, :company => new_attributes}, valid_session
company.reload
skip("Add assertions for updated state")
end
Используя FactoryGirl, я заполнил это с помощью:
let(:valid_attributes) { FactoryGirl.build(:company).attributes.symbolize_keys }
describe "PUT update" do
describe "with valid params" do
let(:new_attributes) { FactoryGirl.build(:company, name: 'New Name').attributes.symbolize_keys }
it "updates the requested company", focus: true do
company = Company.create! valid_attributes
put :update, {:id => company.to_param, :company => new_attributes}, valid_session
company.reload
expect(assigns(:company).attributes.symbolize_keys[:name]).to eq(new_attributes[:name])
Это работает, но похоже, что я должен проверить все атрибуты, а не просто проверять измененное имя. Я попытался изменить последнюю строку на:
class Hash
def delete_mutable_attributes
self.delete_if { |k, v| %w[id created_at updated_at].member?(k) }
end
end
expect(assigns(:company).attributes.delete_mutable_attributes.symbolize_keys).to eq(new_attributes)
Это почти сработало, но я получаю следующую ошибку от rspec, связанной с полями BigDecimal:
-:latitude => #<BigDecimal:7fe376b430c8,'0.8137713195 830835E2',27(27)>,
-:longitude => #<BigDecimal:7fe376b43078,'-0.1270954650 1027958E3',27(27)>,
+:latitude => #<BigDecimal:7fe3767eadb8,'0.8137713195 830835E2',27(27)>,
+:longitude => #<BigDecimal:7fe3767ead40,'-0.1270954650 1027958E3',27(27)>,
Использование rspec, factory_girl и scaffolding невероятно распространено, поэтому мои вопросы:
Каков хороший пример теста rspec и factory_girl для обновления PUT с допустимыми параметрами?
Нужно ли использовать attributes.symbolize_keys
и удалить изменяемые ключи? Как я могу получить эти объекты BigDecimal для оценки как eq
?