Я пытаюсь написать неудачный тест Rspec. Фактический тест связан с гораздо более длинным кодом, но я сузил проблему до метода класса, который он тестирует.Rspec передает метод класса, но метод экземпляра с ошибкой
Вот тест в Rspec:
context "For '.CASH.' as a stock" do
let!(:cash) { FactoryGirl.create(:stock, symbol: '.CASH.', name: 'cash', status: 'Available') }
describe "When update_stock runs on it" do
it "should still have an 'Available' status" do
# status should be 'Error' and test should fail
Stock.change_to_error
expect(cash.status).to eq('Available')
end
end
end
Это тестирует метод класса модели в Stock.rb:
def self.change_to_error
self.all.each do |stock|
stock.status = "Error"
stock.save
end
end
По какой-то причине, это проходит. Однако, если я изменил его использовать метод экземпляра, он потерпит неудачу, как это необходимо:
Если stock_spec.rb изменен метод экземпляра:
context "For '.CASH.' as a stock" do
let!(:cash) { FactoryGirl.create(:stock, symbol: '.CASH.', name: 'cash', status: 'Available') }
describe "When update_stock runs on it" do
it "should still have an 'Available' status" do
# status should be 'Error' and test should fail
cash.change_to_error
expect(cash.status).to eq('Available')
end
end
end
И если метод класса stock.rb превратился в экземпляр метод:
def change_to_error
self.status = 'Error'
self.save
end
Это пройдет. К сожалению, я должен использовать метод класса вместо метода экземпляра, потому что я хочу обновить все запасы в БД. Методы «Change_to_error» находятся здесь, чтобы выяснить проблему. Кто-нибудь знает, почему он проходит как метод класса, когда он должен потерпеть неудачу? Но это неправильно, когда используется метод экземпляра?
Фактически, происходит то, что метод класса не изменяет атрибут статуса «cash», но метод экземпляра делает это. Я не знаю, почему это происходит.
FYI, я использую RSpec рельсы
Можете ли вы попробовать изменить 'stock.save' на' stock.save! '? Если что-то не так, это вызовет исключение. – 31piy
Я пробовал это. Не помогло. Другие идеи? – HoodieOnRails
Попробуйте использовать 'Stock.find_each {| stock | stock.update_column (: status, 'Error')} '. – 31piy