2015-11-03 102 views
0

我回頭努力學習TDD測試。我正在編寫一個教程,希望我創建將與主題相關的SponsoredPosts。Ruby on Rails - TDD在測試時測試錯誤

我對TDD測試頗爲陌生,所以打了一下呃。

我還沒有創建一個控制器或模型,包含兩個單詞「贊助」「帖子」,所以我不知道處理它們時的協議,所以我會爲您提供一切,我認爲是相關的話希望你能告訴我我哪裏出錯了。我相信我只是將模型和控制器的名稱混淆在一起,因爲在我的模式文件中可以看到「sponsor_posts」表的屬性爲「topic_id」。我承認,我不是最擅長命名模型或控制器的人員,因爲他們知道如何處理這些模型或控制器,所以您還可以提供任何解釋來進一步幫助我理解在命名它們時出錯的位置非常有幫助

這裏是我的Sponsored_Posts_Controller_Spec:

require 'rails_helper' 
include RandomData 

RSpec.describe SponsoredPostsController, type: :controller do 

    let (:my_topic) { Topic.create!(name: RandomData.random_sentence, description: RandomData.random_paragraph) } 
    let (:my_sponsored_post) { my_topic.sponsored_posts.create!(title: RandomData.random_sentence, body: RandomData.random_paragraph, price: 6) } 

    describe "GET show" do 

    it "returns http success" do 
     get :show, topic_id: my_topic.id, id: my_sponsored_post.id 
     expect(response).to have_http_status(:success) 
    end 

    it "renders the #show view" do 
     get :show, topic_id: my_topic.id, id: my_sponsored_post.id 
     expect(response).to render_template :show 
    end 

    it "assigns my_sponsored_post to @sponsored_post" do 
     get :show, topic_id: my_topic.id, id: my_sponsored_post.id 
     expect(assigns(:sponsored_posts)).to eq(my_sponsored_post) 
    end 
    end 


end 

這裏是Sponsored_Post我的模型規格:

require 'rails_helper' 
include RandomData 

RSpec.describe SponsoredPost, type: :model do 
    let(:topic) { Topic.create!(name: RandomData.random_sentence, description: RandomData.random_paragraph) } 

    let(:sponsored_post) { topic.sponsored_posts.create!(title: RandomData.random_sentence, body: RandomData.random_paragraph, price: 6) } 

    it { should belong_to(:topic) } 

    describe "attributes" do 

    it "should respond to title" do 
     expect(sponsored_posts).to respond_to(:title) 
    end 

    it "should respond to body" do 
     expect(sponsored_posts).to respond_to(:body) 
    end 

    it "should respond to price" do 
     expect(sponsored_posts).to respond_to(:price) 
    end 

    end 
end 

這裏是我的SponsoredPosts控制器:

class SponsoredPostsController < ApplicationController 

    def show 
    @sponsored_post = Sponsored_post.find(params[:id]) 
    end 

    def new 
    end 

    def edit 
    end 

end 

這裏是我的SponsoredPost模型:

class SponsoredPost < ActiveRecord::Base 
    belongs_to :topic 
end 

這裏是我的架構文件:

ActiveRecord::Schema.define(version: 20151102190350) do 

    create_table "advertisements", force: :cascade do |t| 
    t.string "title" 
    t.text  "copy" 
    t.integer "price" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "comments", force: :cascade do |t| 
    t.text  "body" 
    t.integer "post_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "comments", ["post_id"], name: "index_comments_on_post_id" 

    create_table "posts", force: :cascade do |t| 
    t.string "title" 
    t.text  "body" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "topic_id" 
    end 

    add_index "posts", ["topic_id"], name: "index_posts_on_topic_id" 

    create_table "questions", force: :cascade do |t| 
    t.string "title" 
    t.text  "body" 
    t.boolean "resolved" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "sponsored_posts", force: :cascade do |t| 
    t.string "title" 
    t.text  "body" 
    t.integer "price" 
    t.integer "topic_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "sponsored_posts", ["topic_id"], name: "index_sponsored_posts_on_topic_id" 

    create_table "topics", force: :cascade do |t| 
    t.string "name" 
    t.boolean "public",  default: true 
    t.text  "description" 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 
    end 

end 

這裏是輸出當我運行了SponsoredPost控制器的規格:

1) SponsoredPostsController GET show returns http success 
    Failure/Error: let (:my_sponsored_post) { my_topic.sponsored_posts.create!(title: RandomData.random_sentence, body: RandomData.random_paragraph, price: 6) } 
ActiveRecord::UnknownAttributeError: 
    unknown attribute 'topic_id' for SponsoredPost. 

2) SponsoredPostsController GET show renders the #show view 
    Failure/Error: let (:my_sponsored_post) { my_topic.sponsored_posts.create!(title: RandomData.random_sentence, body: RandomData.random_paragraph, price: 6) } 
ActiveRecord::UnknownAttributeError: 
    unknown attribute 'topic_id' for SponsoredPost. 

3) SponsoredPostsController GET show assigns my_sponsored_post to @sponsored_post 
    Failure/Error: let (:my_sponsored_post) { my_topic.sponsored_posts.create!(title: RandomData.random_sentence, body: RandomData.random_paragraph, price: 6) } 
ActiveRecord::UnknownAttributeError: 
    unknown attribute 'topic_id' for SponsoredPost. 

這裏是輸出當我運行的規範型號:

1) SponsoredPost should belong to topic 
Failure/Error: it { should belong_to(:topic) } 
    Expected SponsoredPost to have a belongs_to association called topic (SponsoredPost does not have a topic_id foreign key.) 
# ./spec/models/sponsored_post_spec.rb:9:in `block (2 levels) in <top (required)>' 

2) SponsoredPost attributes should respond to title 
Failure/Error: expect(sponsored_posts).to respond_to(:title) 
NameError: 
    undefined local variable or method `sponsored_posts' for #<RSpec::ExampleGroups::SponsoredPost::Attributes:0x007f992170a460> 
# ./spec/models/sponsored_post_spec.rb:14:in `block (3 levels) in <top (required)>' 

3) SponsoredPost attributes should respond to body 
Failure/Error: expect(sponsored_posts).to respond_to(:body) 
NameError: 
    undefined local variable or method `sponsored_posts' for #<RSpec::ExampleGroups::SponsoredPost::Attributes:0x007f9921701388> 
# ./spec/models/sponsored_post_spec.rb:19:in `block (3 levels) in <top (required)>' 

4) SponsoredPost attributes should respond to price 
Failure/Error: expect(sponsored_posts).to respond_to(:price) 
NameError: 
    undefined local variable or method `sponsored_posts' for #<RSpec::ExampleGroups::SponsoredPost::Attributes:0x007f99216f9ac0> 
# ./spec/models/sponsored_post_spec.rb:23:in `block (3 levels) in <top (required)>' 

回答

1

在這裏我能爲你推薦什麼:

  • 還有就是你的控制器裏面錯字應該SponsoredPost而不是Sponsored_post
  • 在你的控制器測試,可變sponsored_posts沒有定義,也許這將是:

    SponsoredPost.create(標題! RandomData.random_sentence,body:RandomData.random_paragraph,price:6,topic:my_topic)

  • 它在你的模型測試中似乎是同樣的問題。

+0

工作就像一個魅力。 – jammer