3

I'm trying to fix my functional tests for a nested resource. My config/routes.rb file looks like this:

Shop360::Application.routes.draw do

  resources :libraries do
    resources :library_imports
  end
end

Nesting the library_imports resources breaks generated tests like this one:

test "should get index" do
  get :index
  assert_response :success
  assert_not_nil assigns(:library_imports)
end

because nesting changes all the URLs.

I've seen advice in several places to fix this by adding a library_id parameter like so:

test "should get index" do
  get :index, :library_id => 1
  assert_response :success
  assert_not_nil assigns(:library_imports)
end

(second line changed)

So to get this to work, I have to explicitly specify a library_id in my library_import fixture? It's been possible since Rails 2.0 to define associations in the fixture data without resorting to these explicit key definitions. Am I now being forced back into this rat's nest because I'm nesting resources?

Is there not a better way to get my test to pass?

Mike E
  • 5,493
  • 1
  • 14
  • 15

2 Answers2

7

OK, this wasn't as complicated as I thought. Let's start with the fixtures:

libraries.yml

lib1:
  name: lib1
  description: Library one

lib2:
  name: lib2
  description: Library two

library_imports.yml

import1:
  name: import1
  description: Import one
  library: lib1

import2:
  name: import2
  description: Import two
  library: lib2

I create associations in this fixture data the proper way (i.e. no explicit keys).

Now, recall the failing test (in library_imports_controller_test.rb):

test "should get index" do
  get :index
  assert_response :success
  assert_not_nil assigns(:library_imports)
end

At the top of this file is the setup callback which looks like this:

setup do
  @library_import = library_imports(:import1)
end

So I can refer to @library_import (and specifically its library_id field) in my test. I change it like so:

test "should get index" do
  get :index, :library_id => @library_import.library_id
  assert_response :success
  assert_not_nil assigns(:library_imports)
end

And my test goes from red to green.

Mike E
  • 5,493
  • 1
  • 14
  • 15
1

Have you tried defining the relationship in the fixture files?

# fixtures/libraries.yml
philly:
  name: Free Library

# fixtures/library_imports
last_import:
  library: philly
Chap
  • 3,483
  • 1
  • 24
  • 27