2013-07-18 50 views
7

tôi sử dụng:Làm thế nào để tạo ra một mô hình với một id nào đó sử dụng rspec và nhà máy cô gái

gem 'rails', '3.2.11' 
gem 'rspec-rails', '2.13.2' 
gem 'webrat', '0.7.3' 
gem 'factory_girl_rails', '4.1.0' 
gem 'spork', '~> 0.9.0.rc' 

Tôi muốn thử nghiệm HP của tôi, nơi tôi luôn luôn có một liên kết đến một người dùng nhất định, vì vậy bộ điều khiển trang cho HP chứa:

@user = User.find(7) 

Và quan điểm của HP bao gồm:

link_to 'See user', @user 

vấn đề là tất cả các test thất bại kể từ khi cơ sở dữ liệu thử nghiệm không có u ser với id 7. Tôi đã thử:

FactoryGirl.define do 
    factory :user do 
    name "Testuser" 
    id "7" 
    end 
end 

... nhưng điều này không hiệu quả. Luôn luôn có lỗi:

Các spec là thế này:

describe "GET 'home'" do 

    before(:each) do 
     FactoryGirl.create(:user) 
    end 

    it "should be successful" do 
     get 'home' 
     response.should be_success 
    end 
end 

Failure/Lỗi: có được 'nhà' ActiveRecord :: RecordNotFound: Không tìm thấy người dùng với id = 7

HP đang làm việc tốt trong thực tế, chỉ là thử nghiệm thất bại. Làm thế nào tôi có thể đảm bảo thử nghiệm này sẽ không thất bại?

+1

Tôi không chắc liệu điều này có hiệu quả hay không, nhưng hãy thử id = 7 –

+0

Bạn có thể thêm mã cho thông số lỗi của mình không? –

+0

Hiển thị mã thông số của bạn nếu bạn muốn trợ giúp hữu ích. Cho đến nay mọi người đều đoán. – boulder

Trả lời

8

gì về chế giễu/stubbing (nhanh hơn nhiều đặc tả khi không tiết kiệm đối tượng cơ sở dữ liệu):

let(:user) { FactoryGirl.build(:user) } 
let(:id) { '1' } 

before do 
    user.stub(:id).and_return(id) # just to illustrate, not necessary if stubbing the find class method 
    User.stub(:find).and_return(user) 
end 

it { expect(user.id).to eq(id) } # just to illustrate 
it { expect(response).to be_success } 
it { expect(assigns(:user)).to eq(user) } 

Nếu bạn vẫn còn có vấn đề với người dùng được chỉ khởi tạo, bạn vẫn có thể sử dụng các kỹ thuật nói trên nhưng thay FactoryGirl.build(:user) bởi FactoryGirl.create(:user)

1

Bạn có thể thiết lập ID của người dùng bằng cách làm một cái gì đó giống như

before 
    u = FactoryGirl.create(:user) 
    u.update_attribute(:id, 7) 
end 

Tuy nhiên, đây là một chút kỳ quặc. Thậm chí, bạn có thể gặp phải trường hợp có 7.

của người dùng, bạn có thể sử dụng lệnh của Rspec để có được người dùng thích hợp. Ví dụ bạn có thể làm một cái gì đó giống như

let(:user_7) { FactoryGirl.create(:user) } 
before { User.stub(:find).with(7).and_return(user_7) } 
+0

Cảm ơn. Update_attribute không thay đổi thông báo lỗi ... Tôi sẽ cố gắng sử dụng các cuống sau ... – user929062

8

Dựa trên phần Using Factories các tài liệu, tôi sẽ thiết lập các id trong spec chính nó với một cái gì đó như:

@user = FactoryGirl.create(:user, :id => 7) 
+1

Điều đó nghe có vẻ logic, nhưng tôi vẫn nhận được thông báo lỗi tương tự. – user929062

+3

Đối với những người tìm thấy câu hỏi này thông qua Google. Giải pháp này hoạt động ngay bây giờ (tháng 8 năm 2015) – Benj

2

Không một câu trả lời nhưng một suspicition. .. bạn có lẽ không nên viết spec cho cách bạn đang làm nó.

trong spec của bạn làm như sau:

u=FactoryGirl.create(:user) 
User.where('id=?',u.id).count.should == 1 

Làm bài kiểm tra của bạn phụ thuộc vào id cụ thể là một công thức cho thảm họa.

+0

Tôi đồng ý với bạn. Nhưng vấn đề là HP của tôi có liên kết đến người dùng cụ thể này. Vì vậy, khi tôi chạy thử nghiệm lỗi là HP không được trả lại vì không có người dùng nào có id 7 trong cơ sở dữ liệu thử nghiệm. Đây là bài kiểm tra duy nhất tôi có mà phụ thuộc vào một id, nhưng tôi thấy không có cách nào khác để tránh điều này. – user929062

0

Trong trường hợp của bạn, tôi chắc chắn bạn chỉ đang kiểm tra xem id người dùng có đang được sử dụng thay vì ID cụ thể hay không.

Khi tôi viết bài kiểm tra, tôi chỉ nhận được id được trả về từ cơ sở dữ liệu đáng tin cậy hơn và gần gũi hơn với những gì bạn đang làm trong thực tế.

Tôi sẽ viết thông số điều khiển giống như thế này.

RSpec.describe MyController, type: :controller do 
    let(:user) { FactoryGirl.create(:user) } 
    before do 
    # login the user here which would resolve which user id is being used 
    sign_in user #assumes you are using warden test helpers 
    get :home 
    end 

    it "allows the user to the page" do 
    assert_response :ok 
    end 
end 

Điều này sẽ tải tốt. Nếu bạn muốn kiểm tra lại xem liên kết có chính xác không, bạn nên thực hiện điều đó trong thông số feature bằng cách sử dụng một cái gì đó như capybara.