我想测试控制器中的方法是否已被调用。
我的控制器看起来像这样:
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
虽然结果相同,但它是一种未定义的方法。
答案 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)
我认为你的意思是存在产品,而不是控制器。