Posted 21 days ago. Visible to the public. Repeats.

Pattern: Disabling a certain feature in tests

There is a kind of features in web applications that hinder automated integration tests. Examples include cookie consent banners or form captchas. Clearly, these should be disabled so you do not have to explicitly deal with them in each and every test (like, every test starting with accepting the cookies notice). On the other hand, they must be tested as well.

A good feature disabling solution should therefore meet these requirements:

  • The feature is generally disabled in tests. A test does not need to do anything manually.

  • It is possible to activate the feature manually, so it can be tested specifically.

Suggested solution

Define a constant that is set to true when in test mode:

Copy
class ExampleController < BaseController SKIP_CAPTCHA = Rails.env.test? ...

Next, depend activation of that feature on the value of that constant:

Copy
private def captcha_valid? return true if SKIP_CAPTCHA ...

To manually activate the feature in tests that actually need it, override the constant:

Copy
Given 'bot detection is enabled' do stub_const 'ExampleController::SKIP_CAPTCHA', false end

You may also choose to enable a feature flag using a tag instead:

Copy
Before '@captcha' do stub_const 'ExampleController::SKIP_CAPTCHA', false end

Once an application no longer requires constant development, it needs periodic maintenance for stable and secure operation. makandra offers monthly maintenance contracts that let you focus on your business while we make sure the lights stay on.

Owner of this card:

Avatar
Dominik Schöler
Last edit:
17 days ago
by Besprechungs-PC
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Dominik Schöler to makandra dev
This website uses cookies to improve usability and analyze traffic.
Accept or learn more