RSpec:断言成功的创建请求而不指定方法



我在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)

最新更新