2013-07-01 12 views
6

Tôi cố gắng để thử nghiệm một phương pháp điều khiển với đoạn mã sau:Reloading một đối tượng không làm việc trong rspec

it "should set an approved_at date and email the campaign's client" do 
    @campaign = Campaign.create(valid_attributes) 

    post :approve, id: @campaign.id.to_s 

    @campaign.reload 
    @campaign.approved_at.should_not be(nil) 
end 

Tuy nhiên, khi tôi chạy thử nghiệm này, tôi nhận được lỗi sau:

Failure/Error: @campaign.reload 
ActiveRecord::RecordNotFound: 
    Couldn't find Campaign without an ID 

Khi tôi chạy các dòng analagous trong giao diện điều khiển đường ray, tải lại hoạt động và giá trị được thiết lập như tôi cần nó được. Tại sao không tải lại làm việc cho tôi khi tôi chạy mã trong một thử nghiệm rspec?

Trả lời

8

tôi giải quyết vấn đề bằng cách chuyển sang FactoryGirl:

@campaign = FactoryGirl.create(:pending_approval_campaign) 
    @campaign.approved_at.should be(nil) 

    post :approve, id: @campaign.id.to_s 

    @campaign.reload 
    @campaign.approved_at.should_not be(nil) 

đó làm việc như dự định

1

tôi sẽ chạy một thử nghiệm để đảm bảo một kỷ lục Campaign là thực sự được tạo ra:

@campaign = Campaign.create(valid_attributes) 
puts @campaign.id 

.reload là nơi đầu tiên trong mã của bạn là một con số không @campaign sẽ cờ một lỗi (vì bạn có thể gọi .to_s trên nil object)

1

Hai nơi có thể có lỗi.

  1. tạo đối tượng. tức là @campaign = Campaign.create(valid_attributes) Đối tượng của bạn có thể không được tạo chính xác. Tôi khuyên bạn nên sử dụng create! thay vì create trong thử nghiệm để bất kỳ lỗi nào cũng sẽ bị ném.

  2. Bộ điều khiển. Khi bộ điều khiển mong muốn tìm đối tượng có id nguyên, bạn cho nó một chuỗi. Đó cũng có thể là vấn đề. Tôi đề nghị bạn không nên chuyển đổi id thành chuỗi. Nếu cho GET, bạn có thể làm điều đó mặc dù không cần thiết. Nếu cho POST, chuyển đổi thành chuỗi là sai.