2016-05-24 16 views
1

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 
+0

Gibt es einen Wert für '@ user'? Erzeugen die Fabriken Fehler, wenn der Benutzer fehlt? – zetetic

+0

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. –

+0

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

Antwort

1

Avatar ist null für einen der Benutzer

+0

Ja, ich denke nur in Test env. Wenn ja, wie kann ich dieses Problem lösen? –

+0

Überprüfen Sie, ob Ihre Benutzerfabrik einen Avatar erstellt. Überprüfen Sie auch, dass der Avatar auf URL reagiert – JaTo

+0

JaTo, Fabrik scheint gut zu funktionieren. Bitte sehen Sie sich mein Update an. Wenn ich das Bild-Tag aus der Ansicht herausnehme, sagt es, dass Avatar nicht Null ist. –