Skip to content

Warn on context fixture helper #1208

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from

Conversation

cupakromer
Copy link
Member

Fixtures are controlled by the underlying ActiveRecord::TestFixtures code. Which sets up fixtures before each example. While the database may have fixture data in it before this point, that data will be reset once the test fixture code runs.

When the fixtures message is sent in an example group, or global fixtures are defined, the Active Record test fixtures register the accessors in an anonymous module. That module is included in the example group's ancestors.

Which means the accessor helpers are available in any example group instance; thus they are available in before(:context) and after(:context). However, the internal fixture setup and cache has not been performed yet. Attempting to call a fixture helper prior to the fixtures being setup, raises an undefined method on NilClass error.

This update shims a module into the fixture registration process. The module creates mirrored accessor helpers which raise a helpful error when called. In order to ensure these are only available in context hooks, the private RSpec APIs (:grimacing:), are redeclared in order to extend the provided example group instance with the accessor preventing module.

Resolve #1201

TODO:

  • Find a way to test this properly
  • Update the cuke documentation about fixtures (there are several pages that need updating)
  • Add Changelog entry
  • Remove reduced travis matrix

To speed up code spike, disable most of the build matrix. The key
current and oldest supported configs remain.
Fixtures are controlled by the underlying `ActiveRecord::TestFixtures`
code. Which sets up fixtures before **each** example. While the database
_may_ have fixture data in it before this point, that data will be reset
once the test fixture code runs.

When the `fixtures` message is sent in an example group, or global
fixtures are defined, the Active Record test fixtures register the
accessors in an anonymous module. That module is included in the example
group's ancestors.

Which means the accessor helpers are available in any example group
instance; thus they are available in `before(:context)` and
`after(:context)`. However, the internal fixture setup and cache has not
been performed yet. Attempting to call a fixture helper prior to the
fixtures being setup, raises an undefined method on `NilClass` error.

This update shims a module into the fixture registration process. The
module creates mirrored accessor helpers which raise a helpful error
when called. In order to ensure these are only available in context
hooks, the private RSpec APIs (:grimacing:), are redeclared in order to
extend the provided example group instance with the accessor preventing
module.
known_fixtures << accessor_name
define_method(accessor_name) do |*_fixture_names|
raise <<-EOS
Fixture accessor `#{accessor_name}` invoked in a `before` or `after` context hook at:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think before(:context) or after(:context) is clearer than before or after context.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. I'll fix that up

@cupakromer
Copy link
Member Author

This has grown very stale. I'm closing it for now. I still think the underly issue should get fixed so I opened #1433.

@cupakromer cupakromer closed this Aug 2, 2015
@JonRowe JonRowe deleted the warn-on-before-context-fixture-helper branch May 16, 2020 18:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Loading fixture in a before :context raise an exception
2 participants