In troubleshooting a system test that is failing, the debugging output from my controller is mixed in with RSpec’s output. I’m guessing that has to do with RSpec capturing terminal output, but it has me wondering if the test is failing before the code has a chance to complete.
The test is of a drag-and-drop operation on screen that results in an Ajax call to the app, followed by activity on screen once the Ajax call completes successfully. The ajax call deletes one record and moves it’s children to another record. I added two debugging statements: one at the beginning of the controller action, dumping the params, and the other after the database changes have been made, stating that the parent record has been deleted. The output looks as follows:
Source = 38347; target = 38360
F
Failures:
1) SKUs Screen Draggable and Droppable actions when dragging and droppng a book on another book with confirmation updates the database correctly
Failure/Error: expect(source.reload).to be_destroyed, "Source book not destroyed"
Source book not destroyed
params: <ActionController::Parameters {"verb"=>"MoveBook", "source_id"=>"book_38347", "dest_id"=>"book_38360", "ts"=>"1617589502334", "controller"=>"books", "action"=>"modify", "format"=>"js"} permitted: false>
book deleted
[Screenshot]: tmp/screenshots/failures_r_spec_example_groups_sk_us_screen_draggable_and_droppable_actions_when_dragging_and_droppng_a_book_on_another_book_with_confirmation_updates_the_database_correctly_752.png
The green highlighted text is output by the test spec before it really gets going. The other two highlighted segments of text are the two troubleshooting outputs from the controller action called via Ajax. Note that they are output after the failure message and before the screen shot message. I find this extremely suspicious. Can I conclude from this that the test failed before the controller action had a chance to run?
FWIW, here is the test (there is other setup code above this, but nothing that should affect the flow through the test (the second “it” is the one causing the failure — the first one succeeds):
describe "when dragging and droppng a book on another book" do
let!(:source) { user.books.first }
let!(:target) { user.books.second }
let!(:source_control) { page.find("#book_#{source.id} .book_title label") } let!(:target_control) { page.find("#book_#{target.id}") } let!(:source_skus) { source.skus.map(&:id).to_set }
let!(:target_skus) { target.skus.map(&:id).to_set }
describe "with confirmation" do
before do
accept_confirm do
source_control.drag_to(target_control)
end
end
it 'changes the display correctly' do
expect(page).to_not have_selector("#book_#{source.id}"), "Source book still exists on page" for sku in source.skus
expect(page).to have_selector("#book_#{target.id} #sku_#{sku.id}"), "Source SKU not found within target book" end
end
it 'updates the database correctly' do
expect(source.reload).to be_destroyed, "Source book not destroyed"
new_target_skus = target.skus.reload.map(&:id).to_set
expect(new_target_skus).to include(*source_skus), "Some Source SKUs not moved to target"
expect(new_target_skus).to include(*target_skus), "Some target SKUs lost during the move"
end
end
Note: When the drop occurs, a “confirm” modal dialog is displayed requiring the user to confirm the operation.