When rails fixtures and namespaces collide

Testing helps Rails apps work properly and stops bugs. Fixtures are a useful testing tool. But fixtures can cause problems when models are namespaced.

Say your app has a regular Vehicle model and a namespaced Vehicles::Car model. By convention, you'd think to place the fixtures in vehicles.yml and vehicles/cars.yml, respectively.

Doesn't work. Rails tries to load the fixtures from vehicles/cars.yml into Vehicle.

Here is why: Rails uses both the fixture file name and path to find the right model. vehicles.yml goes to Vehicle based on the name. But so does vehicles/cars.yml based on the path.

Don't just rename your model classes or namespaces to work around this.

Instead, move vechicles/cars.yml to vehicles_cars.yml (ie, it must not be in the vechicles folder), and add these lines at the top of the file:

_fixture: model
  class: Vehicles::Car

Now rails loads vehicles_cars.yml into Vehicles::Car, avoiding the collision.

In summary:

  • Rails matches fixtures using name and path

  • Collisions happen when name of one class matches the path of another

  • Specify the model class explicitly rather than renaming your classes and namespaces

Explicit model classes remove guesswork. Fixtures load properly. Tests run cleanly. Careful fixture setup prevents headaches.