我在Rails控制器内的create
方法中有以下代码:
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
为了测试这个代码,我在RSpec文件中有这样的期望:
expect(response).to redirect_to(assigns(:product))
使用assigns
已被弃用/已被移至gem,坦率地说,我不在乎控制器中是否创建了@product
或@my_product
。事实上,我只是想知道我是否被重定向到了/products/<some-id>
。有(推荐的(方法吗?
如果您想要呈现新的,您需要将gem 'rails-controller-testing'
添加到Gemfile中。
看完你的评论后,我猜你的动作#create看起来像这样:
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
你可以做这样的测试:
describe 'POST /products' do
context 'when everithing is ok' do
it 'returns the product' do
post products_url, params: { product: { description: 'lorem ipsum', title: 'lorem ipsum' } }
expect(response).to redirect_to(product_url(Product.last))
end
end
context 'when something worong' do
it 'redirect to new' do
post products_url, params: { product: { description: 'lorem ipsum' } }
expect(response).to render_template(:new)
end
end
end
这个GitHub问题解释了为什么assigns
不推荐使用
测试控制器设置了哪些实例变量是个坏主意。这严重超出了测试应该知道的范围。您可以测试设置了什么cookie、返回了什么HTTP代码、视图的外观或数据库发生了什么变化,但测试控制器的内部并不是一个好主意。
您可以使用have_http_status matcher 测试响应状态代码
expect(response).to have_http_status(:success)