Part 2: use BDD+TDD to get new scenarios passing
We've provided three Cucumber scenarios to
drive creation of the happy path of Search for Movies by Director.
The first lets you add director info to an existing movie,
and doesn't require creating any new views or controller actions
(but does require modifying existing views, and will require creating a new step definition and possibly adding a line
or two to features/support/paths.rb
).
The second lets you click a new link on a movie details page "Find Movies With Same Director",
and shows all movies that share the same director as the displayed movie.
For this you'll have to modify the existing Show Movie view, and you'll have to add a route,
view and controller method for Find With Same Director.
The third handles the sad path, when the current movie has no director info but we try to do "Find with same director" anyway.
Going one Cucumber step at a time, use RSpec to create the appropriate controller and model specs to drive the creation of the new controller and model methods. At the least, you will need to write tests to drive the creation of:
-
a RESTful route for Find Similar Movies (HINT: use the 'match' syntax for routes as suggested in "Non-Resource-Based Routes" in Section 4.1 of ESaaS). You can also use the key :as to specify a name to generate helpers (i.e. search_directors_path) http://guides.rubyonrails.org/routing.html Note: you probably won’t test this directly in rspec, but a line in Cucumber or rspec will fail if the route is not correct.
-
a controller method to receive the click on "Find With Same Director", and grab the id (for example) of the movie that is the subject of the match (i.e. the one we're trying to find movies similar to)
-
a model method in the Movie model to find movies whose director matches that of the current movie. Note: This implies that you should write at least 2 specs for your controller: 1) When the specified movie has a director, it should... 2) When the specified movie has no director, it should ... and 2 for your model: 1) it should find movies by the same director and 2) it should not find movies by different directors.
It's up to you to
decide whether you want to handle the sad path of "no director" in the
controller method or in the model method, but you must provide a test
for whichever one you do. Remember to include the line
require 'rails_helper'
at the top of your *_spec.rb files.
We want you to report your code coverage as well.
Add gem 'simplecov', :require => false
to the test group of your gemfile, then run bundle install --without production
.
Next, add the following lines to the TOP of spec/rails_helper.rb and features/support/env.rb:
require 'simplecov'
SimpleCov.start 'rails'
Now when you run rspec
or cucumber
, SimpleCov will generate a report in a directory named
coverage/
. Since both RSpec and Cucumber are so widely used, SimpleCov
can intelligently merge the results, so running the tests for Rspec does
not overwrite the coverage results from SimpleCov and vice versa.
To see the results in Cloud9, open /coverage/index.html. You will see the code, but click the Run button at the top. This will spin up a web server with a link in the console you can click to see your coverage report.
Improve your test coverage by adding unit tests and/or Cucumber features for untested or undertested code. Specifically, you can write unit tests for the update
, destroy
, and create
controller methods, and perhaps bring in cucumber scenarios (and step definitions) from previous assignments.