0

下午所有,

我刚刚开始学习 Rails 的测试方面,并且在下面遇到了一些麻烦。

让我快速解释一下我要测试的内容。如果用户创建了 10 个已批准的片段,那么他们的排名应该 ==“作者”。我在工厂中列出的一本书上创建了一个片段,但我的代码全乱了,我不知道该怎么写。

这是我一直在玩的测试代码:

describe "ranking" do

    let!(:book) { Book.create }

    let!(:snippet) { FactoryGirl.create(:snippet1, :book1 => book) }

      context "should be author after 10 approved posts" do

         10.times do

          FactoryGirl.create(:snippet1)

         end

         user.user_rank.should == "Author"

      end

  end

这是我的工厂:

FactoryGirl.define do

  factory :admin2, class: User do

    first_name "admin1"

    last_name "minstrator"

    password "admin1234"

    profile_name "profilename"

    email "admin1@admin.com"

    password_confirmation "admin1234"

    admin true

    end



    factory :user2, class: User do

    first_name "user2"

    last_name "man2"

    password "user1234"

    profile_name "profilename"

    email "user2@user.com"

    password_confirmation "user1234"

    admin false

    end



    factory :book1, class: Book do

    title "Book1"

    approved true

    size 0

    end



    factory :snippet1, class: Snippet do

    content "Snippet1"

    approved true

    end



  end

编辑:错误和相关代码:

app/models/snippet.rb:32:in `size_limit': undefined method `size' for nil:NilClass (NoMethodError)

这与下面显示的模型中的验证有关:

  BOOK_SIZE = { 

    0 => {'per' => 500, 'total' => 15000},

    1 => {'per' => 700 , 'total' => 30000},

    2 => {'per' => 1000, 'total' => 50000}

  }





   def size_limit 

    book_limit = self.book.size.to_i

    word_count = self.content.scan(/\w+/).size.to_i

    current_snippets_size = (self.book.get_word_count || 0) + word_count 

    errors.add(:base, "Content size is too big") unless word_count < BOOK_SIZE[book_limit]['per'] && current_snippets_size < BOOK_SIZE[book_limit]['total']    

  end
4

2 回答 2

1

您的let(:snippet)子句使用了一个:book1属性,但代码正在检查self.book- 可能是这样吗?

无论哪种方式,您列出的 snippet.rb 摘录都有两个引用.size- 在不知道您的行号的情况下,我们很难判断哪个是抛出错误。

因此,无论是 book 属性还是 content 属性都返回 nil - 因此,当您对该 nil 属性调用 size 时,您会得到正在发生的错误。

如果片段仅对书籍参考和非零内容有效,请为这些条件添加验证。如果在某些情况下这些属性可能为零,请确保您的代码允许这样做。

于 2013-11-05T12:03:32.277 回答
1

我认为您的 snippet1 工厂应该有 user_id 或类似的东西。现在你创建了 10 个没有关联的片段

编辑:现在我读了你的编辑。但租用几乎相同。您的 snippet1 工厂没有任何书,因此对此有错误

self.book.size.to_i
于 2013-11-05T11:58:24.520 回答