실패한 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
이것은 통과합니다. 불행히도 DB의 모든 주식을 업데이트하고 싶기 때문에 인스턴스 메서드 대신 클래스 메서드를 사용해야합니다. "Change_to_error"메소드는 문제를 파악하기위한 것입니다. 그것은 실패 할 때 클래스 메서드로 전달하는 이유를 누구나 알 수 있습니까? 하지만 인스턴스 메서드를 사용할 때 제대로 실패합니까?
효과적으로, 클래스 메소드는 '현금'의 상태 속성을 변경하지 않지만 인스턴스 메소드는 변경됩니다. 나는 그것이 왜 일어나고 있는지 모른다.
참고로, 나는 RSpec에 레일을
'stock.save'를'stock.save!'로 변경할 수 있습니까? 잘못된 것이 있으면 예외가 발생합니다. – 31piy
나는 그것을 시험해 보았다. 도와주지 않았어. 다른 아이디어? – HoodieOnRails
'Stock.find_each {| stock | stock.update_column (: 상태, '오류')}'. – 31piy