2012-10-24 48 views
5

Tôi đang cố kiểm tra các kết hợp trong các kiểm tra bộ điều khiển Rspec của mình. Vấn đề là Nhà máy không sản xuất các hiệp hội cho lệnh attributes_for. Vì vậy, sau khi đề nghị trong this post tôi xác định Validate của tôi thuộc tính trong tôi đặc tả bộ điều khiển như vậy:Thuộc tính FactoryGirl_for và các liên kết

def valid_attributes 
    user = FactoryGirl.create(:user) 
    country = FactoryGirl.create(:country) 
    valid_attributes = FactoryGirl.build(:entitlement, user_id: user.id, country_id: country.id, client: true).attributes.symbolize_keys 
    puts valid_attributes 
end 

Tuy nhiên, khi chạy thử nghiệm điều khiển tôi vẫn nhận được các lỗi sau đây:

EntitlementsController PUT update with valid params assigns the requested entitlement as @entitlement 
    Failure/Error: entitlement = Entitlement.create! valid_attributes 
    ActiveRecord::RecordInvalid: 
    Validation failed: User can't be blank, Country can't be blank, Client & expert are both FALSE. Please specify either a client or expert relationship, not both 

Tuy nhiên, các đầu ra valid_attributes trong terminal hiển thị rõ ràng rằng mỗi valid_attribute có user_id, country_id và expert được đặt thành true:

{:id=>nil, :user_id=>2, :country_id=>1, :client=>true, :expert=>false, :created_at=>nil, :updated_at=>nil} 

Trả lời

4

Dường như bạn có puts làm dòng cuối cùng trong phương thức valid_attributes của bạn, trả về số không. Đó là lý do tại sao khi bạn vượt qua nó để Entitlement.create! bạn nhận được một lỗi về người dùng và đất nước là trống vv

Hãy thử loại bỏ mà puts dòng, vì vậy bạn chỉ có:

def valid_attributes 
    user = FactoryGirl.create(:user) 
    country = FactoryGirl.create(:country) 
    FactoryGirl.build(:entitlement, user_id: user.id, country_id: country.id, client: true).attributes.symbolize_keys 
end 

Ngẫu nhiên, bạn không nên thực sự đang tạo người dùng và quốc gia và sau đó chuyển id của họ tới build, bạn có thể thực hiện điều đó trong chính nhà máy bằng cách bao gồm các dòng có usercountry trong nhà máy entitlement. Khi bạn chạy FactoryGirl.build(:entitlement), nó sẽ tự động tạo chúng (nhưng không thực sự lưu bản ghi entitlement).

+0

Xin cảm ơn - đã làm việc trong đêm nay quá lâu! –

Các vấn đề liên quan