简体   繁体   中英

Rspec FactoryGirl :: Failure/Error expected: 1 time received: 0 times

Hi i'm new on ruby on rails.

Currently i'm having a problem testing controller on rails using rspec and FactoryGirl. I'm trying to test activerecord for corresponding with my action 'show' but it didn't get through or received any. Is there anything that i can do to fix this? thank you

the error i got is :

 *Failure/Error: Employment::LevelAccess.should_receive(:find).with(@level_access.id.to_s).and_return(@level_access)
   (<Employment::LevelAccess(id: integer, employment_id: integer, accessiblity_id: integer, actions: string, user_id: integer, created_at: datetime, updated_at: datetime) (class)>).find("1")
       expected: 1 time
       received: 0 times*

Here are my codes

level_access_controller.erb :

context 'require instance' do

  before do
    @level_access = FactoryGirl.create(:level_access_2, employment_id: @employment.id)
  end

  describe 'Get id to Show' do

    it "should find the correct value to show" do
      Employment::LevelAccess.should_receive(:find).with(@level_access.id.to_s).and_return(@level_access)
      get :show, :employment_id => @employment.id, :id => @level_access.id        
    end

  end

  describe 'Get show' do

    before do
      get :show , :employment_id => @employment.id, :id => @level_access.id 
    end

    it "should render a show page" do
      expect(response).to render_template("show")
    end

    it "should not redirect to any page" do
      response.should_not redirect_to("hahahha")
    end

  end        

end

FYI: i also already make an instance for the employment as well.

Factories/level_access.erb :

FactoryGirl.define do

factory :level_access, class: Employment::LevelAccess do
    employment_id   {FactoryGirl.create(:employment).id}
    actions             'create,update,new,destroy,show'
end

factory :level_access_2, class: Employment::LevelAccess do
    actions             'show'
end

end

in controller

def show
  @employee = Employee.find(params[:id])
end

in controller rspec

before do
  @emp = FactoryGirl.create(:employee)
  get :show , id => @emp.id
end

it "find the employee with provided id" do
  assigns[:employee].should == @emp
end

it "should render a show page" do
  response.should render_template('show')
end

it "should not redirect to any page" do
  response.should_not redirect_to("hahahha")
end

'assigns' allows u to access the instance variable from the controller in the spec. for more info on correct way of writing rspec, pls have a look at http://betterspecs.org/

I finally figure it out by asking help from my project manager

he quoted

LevelAccessController :

class Manage::Employments::LevelAccessesController < InheritedResources::Base before_filter :authenticate_user! defaults :resource_class => Employment::LevelAccess, :collection_name => 'level_accesses', :instance_name => 'level_access'

protected

  def begin_of_association_chain
        employment
  end

  def employment
    @employment ||= Employment.find(params[:employment_id])
  end

end


so i change the rspec which describe 'Get id to Show' do

it "should find the correct value to show" do
  Employment::LevelAccess.should_receive(:find).with(@level_access.id.to_s).and_return(@level_access)
  get :show, :employment_id => @employment.id, :id => @level_access.id        
end

end

into

        it "should find the correct value to update" do
          @employment.level_accesses.should_receive(:find).with(@level_access.id.to_s).and_return(@level_access)
          put :update, :employment_id => @employment.id, :id => @level_access.id
        end

since the begin_of association_chain relation in controller should have make the instance available for relation chaining in the rspec.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM