测试我的控制器中的方法是否被调用

时间:2014-07-02 23:02:23

标签: ruby-on-rails rspec

我想测试控制器中的方法是否已被调用。

我的控制器看起来像这样:

def index
  if id_filters
    @products = Product.where(id: id_filters)
  else
    @products = Product.paginate(params[:page].to_i, params[:per].to_i)
  end

render json: @products, meta: @products.meta
end

我看到有人使用下面的代码执行此操作,因此我尝试在RSpec中使用以下代码进行测试:

controller.stub!(:paginate).and_return true

然而,我收到一个错误:

undefined method `stub!' for #<ProductsController:0x00000102bd4d38>

我也尝试过:

controller.stub(:paginate).and_return true

虽然结果相同,但它是一种未定义的方法。

2 个答案:

答案 0 :(得分:0)

CORRECT SYNTAX

如果您在3.0版之前使用rspec ,则正确的语法是

controller.should receive(:paginate).and_return(true)
# OR this equivalence
controller.should receive(:paginate) { true }
# OR (when you are in "controller" specs)
should receive(:paginate) { true }

如果您使用的是rspec 3.0或更高版本,则正确的语法为

expect(controller).to receive(:paginate) { true }
# OR (when you are in "controller" specs)
is_expected.to receive(:paginate) { true }

您的代码

您似乎正在为paginate测试Product,因此您的语法应为:

# Rspec < 3.0
Product.should receive(:paginate) { true }
# Rspec >= 3.0
expect(Product).to receive(:paginate) { true }

答案 1 :(得分:0)

我认为你的意思是存在产品,而不是控制器。