2010-09-12 23 views
7

Tôi cố gắng để thử ra băm phiên cho một bộ điều khiển như vậy:ray rspec chế giễu phiên băm

it "finds using the session[:company_id]" do 
    session.should_receive(:[]).with(:company_id).and_return 100 
    Company.should_receive(:find).with(100) 
    get 'show' 
end 

Khi tôi gọi get 'show' nó nói:

received :[] with unexpected arguments 
expected: (:company_id) 
    got: ("flash") 

Mã điều khiển trông giống như:

def show 
    company_id = session[:company_id] 
    @company = Company.find params[company_id] 
end 

tôi cũng chỉ đơn giản là cố gắng thiết lập

it "finds using the session[:company_id]" do 
    session[:company_id]= 100 
    Company.should_receive(:find).with(100) 
    get 'show' 
end 

nhưng sau đó nhận được một vấn đề về:

expected: (100) 
got: (nil) 

Bất cứ ai có ý tưởng tại sao?

+0

Đây là câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/8043956/rspec-2-7-access-controller-session-in-spec-before-making-request/13369734#13369734 –

Trả lời

0

Đó là vì bạn tìm nạp phiên flash từ bộ điều khiển của mình. Vì vậy, xác định nó. Flash được lưu trong phiên.

it "finds using the session[:company_id]" do 
    session.stub!(:[]).with(:flash) 
    session.should_receive(:[]).with(:company_id).and_return 100 
    Company.should_receive(:find).with(100) 
    get 'show' 
end 
+0

tôi đã cố gắng này, nhưng tôi vẫn nhận được một lỗi 1) CompanyController GET 'show' tìm thấy bằng cách sử dụng phiên [: company_id] Failure/lỗi: có được 'show' phương pháp xác định 'quét' cho nil: NilClass #/Users /adam/.rvm/gems/ruby-1.8.7-p299/gems/activesupport-3.0.0/lib/active_support/whiny_nil.rb:48:in 'method_missing '... –

1

thử điều này:

session.expects(:[]).with(has_entries('company_id' => 100)) 
4

Tôi chỉ chạy vào này. Tôi không thể quản lý để có được should_receive không can thiệp vào các công cụ flash.

Nhưng điều này hãy để tôi kiểm tra hành vi của tôi đang tìm kiếm:

it "should redirect to intended_url if set" do 
    request.env['warden'] = double(:authenticate! => true) 
    session.stub(:[]).with("flash").and_return double(:sweep => true, :update => true, :[]= => []) 
    session.stub(:[]).with(:intended_url).and_return("/users") 
    post 'create' 
    response.should redirect_to("/users") 
end 

Hy vọng rằng sẽ giúp ...

2

tôi không thể tìm ra cách để chế nhạo container phiên bản thân, tuy nhiên trong nhiều trường hợp chỉ cần truyền dữ liệu phiên với yêu cầu là đủ. Vì vậy, thử nghiệm sẽ chia thành hai trường hợp:

it "returns 404 if company_id is not in session" do 
    get :show, {}, {} 
    response.status.should == 404 # or assert_raises depending on how you handle 404s 
end 

it "finds using the session[:company_id]" do 
    Company.should_receive(:find).with(100) 
    get :show, {}, {:company_id => 100} 
end 

PS: quên đề cập đến Tôi đang sử dụng một số người trợ giúp tùy chỉnh từ this snippet.

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