Fixrb

A Fresh Take on Ruby Testing

· Cyril Kato

Published before Fix 1.0. The post is kept as it was written, and its examples may refer to earlier versions of the gems: for Fix 1.0, see the guide.

Today marks an exciting milestone in our journey as we announce the release of Fix 0.7! After months of careful development and multiple iterations, we’re proud to present a testing framework that brings simplicity and clarity back to Ruby testing.

The Philosophy Behind Fix

Fix emerged from a simple observation: testing frameworks shouldn’t be more complex than the code they’re testing. Built on just 148 lines of code and powered by the Spectus expectation library, Fix takes a deliberately minimalist approach. We’ve intentionally omitted features like benchmarking and mocking to focus on what matters most: writing clear, maintainable specifications.

Key Features

Why Another Testing Framework?

After a decade of Ruby development, I found myself struggling to understand RSpec’s source code. This raised a concerning question: if a testing framework is more complex than the code it tests, how confident can we be in our tests?

Let’s look at a revealing example:

class App
  def equal?(*)
    true
  end
end

require "rspec"

RSpec.describe App do
  it "is the answer to life, the universe and everything" do
    expect(described_class.new).to equal(42)
  end
end

Running this with RSpec:

$ rspec wat_spec.rb
.

Finished in 0.00146 seconds (files took 0.17203 seconds to load)
1 example, 0 failures

Surprisingly, RSpec tells us that App.new equals 42! While this specific issue could be resolved by reversing actual and expected values, it highlights potential risks in complex testing frameworks.

Fix in Action

Let’s see how Fix handles a real-world test case:

# car_spec.rb
require "fix"

Fix :Car do
  on :new, color: "red" do
    it { MUST be_an_instance_of Car }

    on :color do
      it { MUST eql "red" }
    end

    on :start do
      it { MUST change(car, :running?).from(false).to(true) }
    end
  end
end

# Running the specification
Fix[:Car].test { Car }

Notice how Fix:

Looking Forward

As we approach version 1.0.0, our focus remains on stability and refinement rather than adding new features. Fix is ready for production use, and we’re excited to see how the Ruby community puts it to work.

Key Areas of Focus

  1. Documentation Enhancement: Making it easier for newcomers to get started
  2. Performance Optimization: Ensuring Fix remains lightweight and fast
  3. Community Feedback: Incorporating real-world usage patterns
  4. Ecosystem Growth: Building tools and extensions around the core framework

Get Involved

Whether you love it or see room for improvement, we want to hear from you. Your feedback will help shape the future of Fix.

Happy testing!