Ich habe ein Profilmodell mit avatar
attr und full_name
Methode, die first_name
und last_name
attrs verwendet. Alle diese sind im Benutzermodell delegiert. Ich verstehe nicht wirklich, wie ich den Klassenfehler bekommen kann. Wenn ich die Image-Tag-Zeile lösche gehen die Tests, so kann Benutzer nicht Null sein, da ich auch user.full_name
aufrufen. Ich habe auch andere Modelle, wo ich die avatar
und full_name
verwende und die Spezifikationen funktionieren gut dort. Es funktioniert auch in dev env.rspec null Klassenfehler in Controller-Spezifikation
Was habe ich hier vermisst?
Fehler für die alle 3 blockiert:
Failure/Error: <%= image_tag user.avatar.url(:small_thumb), class: "profile-index-avatar" %>
ActionView::Template::Error:
undefined method `url' for nil:NilClass
Did you mean? URI
show.html.erb
<% @product.users.each_slice(2) do |user_row| %>
<div class="row" style="padding-top:20px;">
<% user_row.each do |user| %>
<%= link_to user_profile_path(user) do %>
<div class="col-md-6 product-user-column">
<%= image_tag user.avatar.url(:small_thumb), class: "profile-index-avatar" %>
<%= user.full_name %>
</div>
<% end %>
<% end %>
</div>
<% end %>
Controller spec
describe "GET show" do
let!(:profile) { create(:profile, user: @user) }
let!(:product) { create(:product, :product_with_nested_attrs) }
let!(:product_user) { create(:product_user, user: @user, product: product, role: "owner") }
before(:each) do
get :show, id: product
end
it "assigns products" do
expect(assigns(:product)).to eq(product)
expect(assigns(:product).industry_products.size).to eq(1)
end
it { is_expected.to respond_with 200 }
it { is_expected.to render_template :show }
end
UPDATE
auf zetetic Vorschläge Basierend I überprüft wenn der Avatar gleich Null ist. Der Benutzer-Avatar ist für die Index-Aktion weder der Avatar noch die Show-Aktion.
Wenn die Methode "avatar not nil for show" eingefügt wird, während show page image tag enthält, wird der gleiche Fehler wie für den Rest ausgelöst. Wenn ich die Image-Tag-Zeile lösche, sagt es, dass es nicht null ist.
describe "GET index" do
let!(:profile) { create(:profile, user: @user) }
let!(:product) { create(:product, :product_with_nested_attrs) }
before(:each) do
get :index
end
it "avatar not nil for show" do
expect(@user.avatar).to_not be_nil
end
it "assigns products" do
expect(assigns(:products)).to eq([product])
end
it { is_expected.to respond_with 200 }
it { is_expected.to render_template :index }
end
describe "GET show" do
let!(:profile) { create(:profile, user: @user) }
let!(:product_user) { create(:product_user, user: @user, product: product, role: "owner") }
let!(:product) { create(:product, :product_with_nested_attrs) }
before(:each) do
get :show, id: product
end
it "avatar not nil for show" do
expect(@user.avatar).to_not be_nil
end
it "assigns products" do
expect(assigns(:product)).to eq(product)
expect(assigns(:product).industry_products.size).to eq(1)
end
it { is_expected.to respond_with 200 }
it { is_expected.to render_template :show }
end
Gibt es einen Wert für '@ user'? Erzeugen die Fabriken Fehler, wenn der Benutzer fehlt? – zetetic
zetetic, '@ user' wird für alle Aktionen verwendet (index, destroy usw.). Es funktioniert also gut (28 Beispiele und 3 Fehler). Und wie ich geschrieben habe, wenn ich die Zeile mit Bild-Tag herausnehmen, geht es mit 'user.full_name'. Alle Spezifikationen bestanden, bevor ich mich entschied, Image-Tag zu setzen. –
Ich würde mir die Fabriken und/oder Modelle genau ansehen, um sicherzustellen, dass sie die erwarteten Werte zurückgeben. Es hilft oft, zusätzliche Erwartungen vorübergehend hinzuzufügen, um sicherzustellen, dass die Werte wirklich da sind (z. B. 'expect (@ user.avatar) .to_not be_nil') – zetetic