class ActionController::TestCase
assert_redirected_to page_url(title: ‘foo’)
If you’re using named routes, they can be easily tested using the original named routes’ methods straight in the test case.
== Testing named routes
cookies.clear
To clear the cookies for a test just clear the cookie collection:<br><br>cookies = “value”<br>session = “value”
To do this just assign a value to the session or cookie collection:
Sometimes you need to set up the session and cookie variables for a test.
== Manipulating session and cookie variables
action call which can then be asserted against.
For redirects within the same controller, you can even call follow_redirect and the redirect will be followed, triggering another
On top of the collections, you have the complete url that a given action redirected to available in redirect_to_url
.
assert flash.empty? # makes sure that there’s nothing in the flash
assert_equal “Dave”, cookies # makes sure that a cookie called :name was set as “Dave”
These collections can be used just like any other hash:
* cookies: Cookies being sent to the user on this request.
* flash: The flash objects currently in the session.
* session: Objects being saved in the session.
can be used against. These collections are:
In addition to these specific assertions, you also have easy access to various collections that the regular test/unit assertions
== Testing controller internals
end
tests WidgetController
class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase
class name, you can explicitly set it with tests
.
from the test class name. If the controller cannot be inferred from the test
ActionController::TestCase will automatically infer the controller under test
== Controller is automatically inferred
Test::Unit::TestCase and define @controller, @request, @response in setup
.)
(Earlier versions of Rails required each functional test to subclass
may use this object to inspect the HTTP response in detail.
after calling post
. If the various assert methods are not sufficient, then you
of the last HTTP response. In the above example, @response
becomes valid
An ActionDispatch::TestResponse object, representing the response
@response::
you might want to set some session properties before sending a GET request.
request. You can modify this object before sending the HTTP request. For example,
An ActionController::TestRequest, representing the current HTTP
@request::
The controller instance that will be tested.
@controller::
variables for use in the tests:
ActionController::TestCase will also automatically provide the following instance
== Special instance variables
end
post :create, json
json = {book: { title: “Love Hina” }}.to_json
def test_create
You can also send a real document in the simulated HTTP request.
end
end
assert_not_nil Book.find_by(title: “Love Hina”)
# Asserts that the controller really put the book in the database.
assert_response :found
# the created book’s URI.
# Asserts that the controller tried to redirect us to
post(:create, params: { book: { title: “Love Hina” }})
# Simulate a POST response with the given HTTP parameters.
def test_create
class BooksControllerTest < ActionController::TestCase
For example:
the controller’s HTTP response, the database contents, etc.
2. Then, one asserts whether the current state is as expected. “State” can be anything:
an HTTP request.
1. First, one uses the get
, post
, patch
, put
, delete
or head
method to simulate
Functional tests are written as follows:
== Basic exampleparsed_body
for effective testing of controller actions including even API endpoints.
integration tests are as fast as functional tests and provide lot of helpers such as as
,
requests, whereas functional style controller tests merely simulate a request. Besides,
only be used for backward compatibility. Integration style controller tests perform actual
New Rails applications no longer generate functional style controller tests and they should
(use ActionDispatch::IntegrationTest).
Rails discourages the use of functional tests in favor of integration tests
== Use integration style controller tests over functional style controller tests.
test a single controller action per test method.
Superclass for ActionController functional tests. Functional tests allow you to