Лучший способ проверить это в целом - использовать change matcher:
Rspec.feature "Creating orders", js: true do
let!(:site ) { create(:site) }
def fill_in_and_submit_form
visit "/orders"
# ...
fill_in "something", with: attributes[:something]
find("#checkoutModal #submit").click()
end
context "with valid attributes" do
let(:attributes){ attributes_for(:order) }
it "creates an order" do
expect do
fill_in_and_submit_form
end.to change(Order, :count).by(1)
end
end
context "with invalid attributes" do
let(:attributes) do
{} # should be a hash with invalid attributes
end
it "does not create an order" do
expect do
fill_in_and_submit_form
end.to_not change(Order, :count)
end
end
end
Это создает запрос подсчета до и после оценки блока. С .size
следует помнить одну вещь: она возвращает длину коллекции, если она уже была загружена. Это не очень хорошая вещь, так как вам нужен счетчик базы данных.
Называть ваше описание функции верхнего уровня "создать успешно" не очень хорошая идея. Он не описывает то, что вы тестируете, он потребует от вас создания двух файлов для проверки на успешность и неудачу.
Этот контроллер также просто неверен.
def create
@order = Order.new(order_params)
if @order.save
redirect_to @order
else
render :new
end
end
@order.save if @order.valid?
is глупо. .save
подтвердит запись и сохранит ее, если она действительна. Вы действительно просто хотите проверить возвращаемое значение save, чтобы увидеть, действительно ли запись была сохранена в базе данных. Если ордера являются вложенной записью, то она также должна выглядеть примерно так:
def create
@site = Site.find(params[:site_id]) # you're not passing it through a hidden input are you?
@order = @site.orders.new(order_params)
if @order.save
redirect_to @order
else
render :new
end
end