2016-08-07 53 views
0

Ich habe folgendes Feature:kann kein Kommentar in Capybara/Gurke erstellen

Scenario: when delete a post 
    Given I created a post with the title "Test", author "Testauthor" and body "Testbody" 
    When I browse "/posts" and click on "Destroy" 
    Then I should see the text "Comment was successfully destroyed." 

Der problematische Code ist dies angesichts imeplementation:

Given(/^I created a post with a comment with title "([^"]*)", author "([^"]*)" and body "([^"]*)"$/) do |title, author, body| 
    post = Post.create! title: 'Test', author: 'Test', body: 'Test', published_at: DateTime.now 
    Comment.create! title: title, author: author, body: body, published_at: DateTime.now, post_id: post.id 
end 

Aus irgendeinem Grund expect(Comment.count).to eq(1) falsch ist, und es gibt keine Kommentare. Was mache ich falsch?

hinzugefügt Repository:https://github.com/cwansart/SQ-Hausarbeit/tree/cucumber/features Es ist die posts_show.feature und die posts_show_steps.rb.

+0

Sind Sie sicher, dass der Kommentar korrekt erstellt wird? Wir müssen noch etwas mehr von deinem Code sehen, besonders im Hinblick auf die Erstellung von Kommentaren. –

+0

Ja, ich weiß, bin. Hier ist der vollständige Code: https://github.com/cwansart/SQ-Hausarbeit/tree/cucumber/features Es ist die posts_show.feature und die posts_show_steps.rb. – Ctwx

+0

Ich sehe 'expect (Comment.count) .to eq (1)' nirgendwo in Ihrem Repo ?? Welchen Fehler genau hast du? –

Antwort

2

Ich habe Ihr Repo geklont und einen Blick darauf geworfen.

Scenario: when delete a post 
    Given I created a post with the title "Test", author "Testauthor" and body "Testbody" 
    When I browse "/posts" and click on "Destroy" 
    Then I should see the text "Comment was successfully destroyed." 

posts_show_steps.rb:

Given(/^I created a post with a comment with title "([^"]*)", author "([^"]*)" and body "([^"]*)"$/) do |title, author, body| 
    post = Post.create! title: 'Test', author: 'Test', body: 'Test', published_at: DateTime.now 
    Comment.create! title: title, author: author, body: body, published_at: DateTime.now, post_id: post.id 

    print "#########################" 
    print Comment.all.pretty_print_inspect 
    ## this shows the comment. It **does** exist... 
end 

When(/^I browse "([^"]*)" and click on "([^"]*)"$/) do |url, click_text| 
    print "#########################" 
    print Comment.all.pretty_print_inspect 
    ## here it doesn't exist any longer... 

    visit url 
end 

Hier erstellen Sie einen Beitrag ohne Kommentar, das ist das erste Problem, das heißt, es ist kein Kommentar zu löschen! Dies kann durch Änderung dieser Given zu fixierenden:

Given I created a post with a comment with title "CommTitle", author "CommAuthor" and body "CommBody" 

(kann auch diesen Schritt Definition wieder verwenden, aber dies wäre besser, wenn dieser Test nur einen Eintrag ohne Kommentar erstellt, streng zu sprechen.)

Sie müssen auch auf den Link "Zerstören" in Ihrer Schrittdefinition klicken - fügen Sie in Ihrer Schrittdefinition click_on click_text nach visit url hinzu.

Sie müssen auch ändern "Kommentar wurde erfolgreich zerstört." zu "Post wurde erfolgreich zerstört." in Ihrer posts_show_feature.rb Spezifikation, denn das testen Sie gerade.

Dieser Test wird nun bestanden.

Allerdings möchten Sie testen, dass Post 's Comment s zerstört werden, wenn das Post zerstört wird, ja?

Dies wird am besten bei Unit Test Ebene getan:

  1. rspec-Schienen gem Install:

Gemfile:

group :test, :development do 
    gem 'rspec-rails', '~> 3.5' 
end 

Lauf rails g rspec:install

  1. Erstellen Sie die folgenden Spezifikationen :

spec/models/comment_spec.rb:

require 'rails_helper' 

RSpec.describe Comment, type: :model do 
    let(:post) { Post.create(title: 'title', author: 'author', body: 'body', published_at: DateTime.now) } 

    it 'is destroyed when its associated Post is destroyed' do 
    post.comments.create(title: 'title', author: 'author', body: 'body', published_at: DateTime.now) 
    expect { post.destroy }.to change{ Comment.count }.by(-1) 
    end 
end 

Es gibt ein paar Möglichkeiten, wie spec zu nähern, sondern dass eine Debatte für eine andere Zeit - dies ist eine Möglichkeit, es zu tun.

Um diesen Test zu bestehen machen (run rspec diesen Test ausführen), fügen Sie zu Ihrem Post Modell eine 'abhängige zerstören' Erklärung:

app/models/post.rb:

class Post < ApplicationRecord 
    has_many :comments, dependent: :destroy 

    validates :author, presence: true 
    validates :title, presence: true 
    validates :body, presence: true 
    validates :published_at, presence: true 
end 

That wird deinen Test bestehen lassen!

Als letzten Tipp, setzen Sie --format documentation in Ihre .rspec Datei, um rspec Druck bestanden Tests (eine persönliche Vorliebe von mir) zu machen.

Ich würde dann eine Rake-Task namens "Tests" erstellen, die sowohl Ihre RSpec-Spezifikationen als auch Ihre Cucumber-Spezifikationen ausführt, aber das ist nicht für diesen Thread.

+0

Danke. Ich denke, ich bin blind. Ich werde das reparieren. – Ctwx