Skip to content

Commit

Permalink
Write a failing test for reloading with Spring
Browse files Browse the repository at this point in the history
This test captures what I think is going on in
#323

Currently the factory_bot_rails reloader only reloads factory
definitions when the definition files have changes (using
`execute_if_updated`).

This can cause problems when editing an application file without also
editing a factory_bot definition file. Rails will reload the entire
application, but will not reload the definitions. This causes
factory_bot to have references to classes that were unloaded from the
Rails application and replaced with new classes.

#329 replaces
`execute_if_updated` with `execute` so that factory_bot_rails will
reload the definition files whenever anything in the application is
changed. Hopefully that PR will get this test to pass!
  • Loading branch information
composerinteralia committed Apr 5, 2019
1 parent 8c09393 commit 122ccb3
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
63 changes: 63 additions & 0 deletions features/reloading.feature
@@ -0,0 +1,63 @@
Feature:
When using factory_bot_rails together with Spring
I want changes to my application to trigger the factory_bot_rails reloader
So that factory_bot_rails doesn't hold onto stale class references

Scenario: Editing a model without editing the factory
When I successfully run `bundle exec rails new testapp -m ../../features/support/rails_template`
And I cd to "testapp"
And I add "factory_bot_rails" from this project as a dependency
And I add "test-unit" as a dependency
And I run `bundle install` with a clean environment
And I write to "db/migrate/1_create_users.rb" with:
"""
migration_class =
if ActiveRecord::Migration.respond_to?(:[])
ActiveRecord::Migration[4.2]
else
ActiveRecord::Migration
end
class CreateUsers < migration_class
def self.up
create_table :users do |t|
t.string :name
end
end
end
"""
And I run `bundle exec rake db:migrate` with a clean environment
And I write to "app/models/user.rb" with:
"""
class User < ActiveRecord::Base
end
"""
And I write to "test/factories.rb" with:
"""
FactoryBot.define do
factory :author, class: User do
name { "Frank" }
end
end
"""
And I write to "test/unit/user_test.rb" with:
"""
require 'test_helper'
class UserTest < ActiveSupport::TestCase
test "use factory" do
author = FactoryBot.create(:author)
assert_equal author.class.object_id, User.object_id
end
end
"""
And I run `bundle exec rake test` with Spring enabled
And I append to "app/models/user.rb" with:
"""
# User model edited
"""
And I run `bundle exec rake test` with Spring enabled
And I run `spring stop` with a clean environment
Then the output should contain "1 runs, 1 assertions"
And the output should not contain "Failure:"
6 changes: 6 additions & 0 deletions features/step_definitions/appraisal.rb
Expand Up @@ -3,3 +3,9 @@
I successfully run `ruby -e 'system({"BUNDLE_GEMFILE" => nil, "DISABLE_SPRING" => "true"}, "#{command}")'`
STEP
end

When /^I run `([^"]+)` with Spring enabled$/ do |command|
step <<~STEP
I successfully run `ruby -e 'system({"BUNDLE_GEMFILE" => nil}, "#{command}")'`
STEP
end

0 comments on commit 122ccb3

Please sign in to comment.