Rspec的。删除操作不适用于let()

时间:2015-02-12 10:07:38

标签: ruby-on-rails ruby testing rspec capybara

我通过访问页面让Rspec测试控制器操作。 当我通过let {)为createedit动作声明新对象时 - 一切都很好。但是对于delete,它不起作用,我必须声明实例变量以使其通过。

我的目标是在删除操作中删除实例变量声明。

它阻止我完成重新分解,我想知道为什么会发生这种情况? 也许它与Capybara范围有某种关系。

失败的测试看起来像:

Failure/Error: it {should have_content('delete')}
       expected #has_content?("delete") to return true, got false

Failure/Error: expect{click_link('delete')}.to change(Crew, :count).by(-1)
     Capybara::ElementNotFound:
       Unable to find link "delete"

我的整个测试

require 'spec_helper'

describe 'CrewPage' do
  subject {page}

  let(:user) {FactoryGirl.create(:user)}
  let(:crew) {Crew.create(name: name, secondname: secondname, rate: rate)}
  let(:name) {'Name'}
  let(:secondname) {'First'}
  let(:rate) {1000}

  before {sign_in(user)}
  #==============================New page===========>>
  describe 'new crew member page' do
    before {visit new_crew_path}

    it {should have_title('New member')}

    let(:submit) {"Create"}

    context 'invalid creation' do
      it 'should not create crew member' do
        expect{click_button submit}.not_to change(Crew, :count)
      end
    end

    context 'valid crew member creation' do
      before do
        fill_in 'Name',               with: name
        fill_in 'Secondname',         with: secondname
        fill_in 'Rate',               with: rate
      end
      it 'should create crew member' do
        expect{click_button submit}.to change(Crew, :count).by(1)
      end
    end
  end

  #==============================Show page===========>>
  describe 'show page' do
    before {visit crew_path(crew)}

    it {should have_title("#{crew.combine_names} profile")}
  end

  #==============================Edit page===========>>
  describe 'edit page' do

    let(:reload_n) {name*2}
    let(:reload_sn) {secondname*2}
    let(:reload_r) {rate*2}

    before {visit edit_crew_path(crew)}

    it {should have_title('Edit panel')}

    context 'successfull edit' do
        before do
        fill_in 'Name',               with: reload_n
        fill_in 'Secondname',         with: reload_sn
        fill_in 'Rate',               with: reload_r
        click_button('Save')
      end
      it {should have_content(reload_n)}
      it {should have_content(reload_sn)}
      it {should have_content(reload_r)}
    end
  end

  #==============================Delete action===========>>
    describe 'delete action from index page' do
        before do
            @crew = Crew.create(name: name, secondname: secondname, rate: rate)
            visit root_path
        end

        it {should have_content('delete')}
        it 'should delete crew member' do
            expect{click_link('delete')}.to change(Crew, :count).by(-1)
        end
    end
end

1 个答案:

答案 0 :(得分:4)

除非在测试本身中调用,否则不会执行

let块。因为您没有在visit_page之前使用此变量,所以不会创建工作人员模型,因此它不会显示在capybara正在玩的页面上。如果您希望在每次测试之前执行它,则必须改为调用let!

let!(:crew) { Crew.create(name: name, secondname: secondname, rate: rate)}
相关问题