【问题标题】:RSpec Controller test, testing a post actionRSpec 控制器测试,测试一个后期动作
【发布时间】:2016-06-05 05:49:35
【问题描述】:

现在我有一个 subscriber 控制器来创建订阅者,但这不是我想要测试的。我在控制器中还有一个方法,将 1 添加到订阅服务器上的访问属性(我将发布代码),这是我想要测试的方法,但我不确定如何测试?我是 Rails 和 Rspec 的新手,所以我很难掌握这些概念。为了清楚起见,我将发布我的测试和控制器。

控制器:

def search
  @subscriber = Subscriber.new
end

def visit
  @subscriber = Subscriber.find_by_phone_number(params[:phone_number])
   if @subscriber
    @subscriber.visit =+ 1
    @subscriber.save
    flash[:notice] = "thanks"
    redirect_to subscribers_search_path(:subscriber)
  else
    render "search"
  end
end

测试

it "adds 1 to the visit attribute" do
  sign_in(user)
  subscriber = FactoryGirl.create(:subscriber)
  visits_before = subscriber.visit
  post :create, phone_number: subscriber.phone_number
  subscriber.reload

  expect(subscriber.visit).to eq(visits_before)
end

错误信息:

如您所见,这是我要测试的方法。当前的测试不起作用,但我认为这可能有助于展示我的想法。希望这是足够的信息,如果您还想看其他内容,请告诉我?

【问题讨论】:

  • 我就是这么回答你的,visits是Instance的方法,不是类的方法。

标签: ruby-on-rails ruby rspec


【解决方案1】:

我认为你可以这样做:

it 'adds 1 to the visit attribute' do
  # I'm assuming you need this, and you are creating the user before
  sign_in(user)
  # I'm assuming your factory is correct
  subscriber = FactoryGirl.create(:subscriber) 
  visits_before = subscriber.visit
  post :create, subscriber: { phone_number: subscriber.phone_number }
  subscriber.reload
  expect(subscriber.visit).to eq(visits_before)
end

【讨论】:

  • 我喜欢这个实现,但是当我将它设置为这个时,我仍然得到一个错误。我在问题中发布了最新的错误。
【解决方案2】:

由于您正在检查subscriber.visits,您应该将Subscriber 更改为subscriber

expect { post :create, :subscriber => subscriber }.to change(subscriber, :visit).by(1)

visits 是实例的方法,而不是类方法。

【讨论】:

    【解决方案3】:

    我认为您正在测试错误的方法。您已经声明您的 create 操作有效,因此无需在这里进行测试。单元测试都是为了隔离被测方法。

    您编写的测试是测试post :create 做某事。如果您想测试您的 visit 方法是否执行某些操作,您需要执行以下操作:

    describe "#GET visit" do
      before { allow(Subscriber).to receive(:find).and_return(subscriber) }
      let(:subscriber) { FactoryGirl.create(:subscriber) }
    
      it "adds one to the visit attribute" do
        sign_in(user)
        expect { get :visit }.to change(subscriber, :visit).by(1)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多