W Rails, jak przetestować format odpowiedzi Javascript?
Jeśli akcja kontrolera wygląda tak:
respond_to do |format|
format.html { raise 'Unsupported' }
format.js # index.js.erb
end
A twój test funkcjonalny wygląda tak:
test "javascript response..." do
get :index
end
Wykona HTML gałąź bloku respond_to.
Jeśli spróbujesz tego:
test "javascript response..." do
get 'index.js'
end
Wykonuje widok (indeks.js.erb) bez uruchamiania akcji kontrolera!
9 answers
Podaj :format
z normalnymi paramami, aby wywołać odpowiedź w tym formacie.
get :index, :format => 'js'
Nie trzeba mieszać z nagłówkami żądań.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-24 17:44:07
Z rspec:
it "should render js" do
xhr :get, 'index'
response.content_type.should == Mime::JS
end
I w akcji kontrolera:
respond_to do |format|
format.js
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-12 06:23:27
Ustaw akceptowany typ zawartości na typ, który chcesz:
@request.accept = "text/javascript"
Połącz to z Twoim testem get :index
, A wykonasz odpowiednie wywołanie do kontrolera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 19:28:57
RSpec 3.7 i Rails 5.rozwiązanie x:
Kilka z tych odpowiedzi było trochę nieaktualnych w moim przypadku, więc postanowiłem podać odpowiedź dla tych, którzy działają Rails 5 i RSpec 3.7:
it "should render js" do
get :index, xhr: true
expect(response.content_type).to eq('text/javascript')
end
Bardzo podobna do odpowiedzi Steve ' a z kilkoma poprawkami. Pierwsza z nich xhr
jest przekazywana jako klucz/para logiczna. Po drugie, używam teraz expect
ze względu na otrzymywanie ostrzeżeń o deprecacji, jeśli są używane. Porównanie content_type
odpowiedzi do text/javascript
zadziałało dla mnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-18 14:03:46
Użyj tego przed żądaniem:
@request.env['HTTP_ACCEPT'] = 'text/javascript'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 18:58:44
Te trzy wydają się być równoważne:
get :index, :format => 'js'
@request.env['HTTP_ACCEPT'] = 'text/javascript'
@request.accept = "text/javascript"
Powodują, że kontroler używa szablonu js (np. index.js.erb)
Podczas symulacji żądania XHR (np. aby uzyskać fragment HTML) możesz użyć tego:
@request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"
Oznacza to żądanie.xhr? powróci prawda.
Zauważ, że podczas symulacji XHR musiałem podać oczekiwany format lub dostałem błąd:
get :index, format: "html"
Testowane Na Rails 3.0.3.
I got ten ostatni ze źródła Rails, tutaj: https://github.com/rails/rails/blob/6c8982fa137421eebdc55560d5ebd52703b65c65/actionpack/lib/action_dispatch/http/request.rb#L160
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-18 11:38:53
Użyj takiego kodu dla parametrów i id użytkownika itp., zauważ, że opcja format jest w tym samym hashu innych parametrów jak id i nested_attributes.
put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 19:14:54
Wiele z powyższych odpowiedzi jest nieaktualnych.
Poprawnym sposobem na zrobienie tego w RSpec 3+ jest post some_path, xhr: true
.
Ostrzeżenie przed deprecjacją prosto z samego RSpec, przy próbie użycia xhr :post, "some_path"
:
DEPRECATION WARNING: `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1.
Switch to e.g. `post comments_path, params: { comment: { body: 'Honey bunny' } }, xhr: true`.
Również, xhr :post, "some_path"
powoduje kilka dziwnych błędów, które nie zdarzają się z post some_path, xhr: true
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-05 03:20:58
Miałem podobny problem:
# controller
def create
respond_to do |format|
format.js
end
end
# test
test "call format js" do
record = promos(:one)
post some_url(record)
assert true
end
A wynik był taki:
> rails test
Error:
ActionController::UnknownFormat: ActionController::UnknownFormat
Poprawiłem to tym dopasowaniem do testu (dodawanie nagłówków):
test "call format js" do
record = promos(:one)
headers = { "accept" => "text/javascript" }
post some_url(record), headers: headers
assert true
end
Rails (6.0.0.beta3)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-19 06:31:14