2016-04-28 8 views
0

Aus irgendeinem Grund die post spec funktioniert gut, aber die post_comment_spec Test schlägt fehl. Post hat viele post_comments, post_comment gehört zum Post.rspec Controller Spezifikationen Test Post Aktion

Fehler:

1) Posts::PostCommentsController when user is logged in POST create with invalid attributes doesn't save the new product in the db 
Failure/Error: <span class="post-comment-updated"><%= local_time_ago(post_comment.updated_at) %></span> 

ActionView::Template::Error: 
    undefined method `to_time' for nil:NilClass 

posts_controller

def create 
    @post = current_user.posts.new(post_params) 
    authorize @post 
    if @post.save 
    respond_to do |format| 
     format.js 
    end 
    else 
    respond_to do |format| 
     format.js 
    end 
    end 
end 

post_comments_controller

def create 
    @post = Post.find(params[:post_id]) 
    @post_comment = @post.post_comments.build(post_comment_params) 
    authorize @post_comment 
    @post_comment.user = current_user 
    #@post_comment.save! 
    if @post_comment.save 
    @post.send_post_comment_creation_notification(@post_comment) 
    @post_comment_reply = PostCommentReply.new 
    respond_to do |format| 
     format.js 
    end 
    else 
    respond_to do |format| 
     format.js 
    end 
    end 
end 

posts_controller_spec.rb

describe "POST create" do 
    let!(:profile) { create(:profile, user: @user) } 

    context "with invalid attributes" do 
    subject(:create_action) { xhr :post, :create, post: attributes_for(:post, user: @user, body: "") } 

    it "doesn't save the new product in the db" do 
     expect{ create_action }.to_not change{ Post.count } 
    end 
    end 
end 

post_comments_controller_spec.rb

describe "POST create" do 
    let!(:profile) { create(:profile, user: @user) } 
    let!(:post_instance) { create(:post, user: @user) } 

    context "with invalid attributes" do 
    subject(:create_action) { xhr :post, :create, post_id: post_instance.id, post_comment: attributes_for(:post_comment, post_id: post_instance.id, user: @user, body: "") } 

    it "doesn't save the new product in the db" do 
     expect{ create_action }.to_not change{ PostComment.count } 
    end 
    end 
end 

create.js.erb für die Zeit nach

$("ul.errors").html(""); 
<% if @post.errors.any? %> 
    $('.alert-danger').show(); 
    $('ul.errors').show(); 
    <% @post.errors.full_messages.each do |message| %> 
    $("ul.errors").append($("<li />").html("<%= message.html_safe %>")); 
    <% end %> 
<% else %> 
    $('ul.errors').hide(); 
    $('.alert-danger').hide(); 
    $('.post-index').prepend('<%= j render @post %>'); 
    collectionPostEditDropdown(); 
    $('.post-create-body').val(''); 
    $('#img-prev').attr('src', "#"); 
    $('#img-prev').addClass('hidden'); 
    $('.btn-create-post').prop('disabled',true); 
    $('.remove-post-preview').addClass('hidden'); 
<% end %> 

create.js.erb für post_comment

<% unless @post_comment.errors.any? %> 
    $("#post-comment-text-area-<%= @post_comment.post_id%>").val(''); 
    $(".post-comment-insert-<%= @post_comment.post_id %>").prepend('<%= j render @post_comment %>'); 
    $(".best_in_place").best_in_place(); 
<% end %> 
+0

Neven, ich verstehe nicht wirklich deine Frage. –

+0

'post_comment' ist nicht gespeichert, also' updated_at' ist null –

+0

Wie kann ich es dann testen? Ich meine, der Code ist in Ordnung, da er nur wiedergegeben wird, wenn er richtig gespeichert wird. –

Antwort

1

Da die Fehlerzustände, der Aufruf an local_time_ago Enden versuchen, to_time auf Null zu rufen - so hat Ihr Kommentar nichts in seinem updated_at Attribut.

In post_comments_controller.rb, warum hast du #@post_comment.save! auskommentiert?

Und was ist @post_comment.save zurück? Ich vermute, dass das Speichern aus irgendeinem Grund fehlschlägt, aber Sie versuchen immer create.js.erb zu rendern, die ein gültiges Objekt @post_comment erwartet.

BEARBEITEN: Sie sollten create.js.erb nicht rendern, wenn @post_comment.save fehlschlägt, da es ein gültiges Objekt @post_comment erwartet. Wahrscheinlich möchten Sie in diesem Fall render json: nil, status: :ok.

+0

Brian hier ist das ursprüngliche Problem: http://stackoverflow.com/questions/36924449/rspec-controller-spec-matchers/36925108?noredirect=1#comment61412428_36925108 Ich habe auskommentiert, weil, wenn ich '@ post_comment.save!' Auch zu verwenden Es sendet Validierungsfehler im Test, der superweid ist. Btw, was ich nicht verstehe, ist warum ich es ursprünglich gesetzt habe, da der Code richtig funktioniert, wie es jetzt ist. Es gibt nur ein Problem mit dem Test. –

+0

Der Validierungsfehler ist hier das Problem - da das 'save' fehlschlägt, versuchen Sie' create.js.erb' mit einem nicht-persistenten Objekt zu rendern. Was war der Validierungsfehler? – Brian

+0

Aktualisiert die Frage. 'Body kann nicht leer sein 'war der Fehler, was in Ordnung ist, da ich' body: '' 'im Test übergebe. –

Verwandte Themen