Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rspec创建多个帖子以检查排名_Ruby On Rails_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails Rspec创建多个帖子以检查排名

Ruby on rails Rspec创建多个帖子以检查排名,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,下午好, 我刚刚开始学习rails的测试方面,在下面遇到了一些问题 让我快速解释一下我要测试的内容。如果用户创建了10个经批准的代码段,则其排名应为“作者”。我在工厂里列出的一本书上创建了一个代码片段,但我的代码都是乱七八糟的,我不知道该怎么写 以下是我在测试中使用的代码: describe "ranking" do let!(:book) { Book.create } let!(:snippet) { FactoryGirl.create(:snippet1, :book

下午好,

我刚刚开始学习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
BOOK_SIZE={
0=>{'per'=>500,'total'=>15000},
1=>{'per'=>700,'total'=>30000},
2=>{'per'=>1000,'total'=>50000}
}
def尺寸限制
书本限制=self.book.size.to\u i
word\u count=self.content.scan(/\w+/).size.to\i
当前片段大小=(self.book.get_单词数| | 0)+单词数
错误。添加(:base,“内容大小太大”),除非word\u count
我认为snippet1工厂应该有用户id或类似的东西。现在您创建了10个没有关联的代码段

编辑:现在我读了你的编辑。但雇佣几乎是一样的。您的snippet1工厂没有任何书籍,因此在这方面存在错误

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

无论哪种方式,您列出的snippet.rb摘录都有两个对
.size
的引用-如果不知道行号,我们很难判断是哪一个引发了错误

因此,book属性或content属性都返回nil–因此,当您调用该nil属性的size时,您会得到正在发生的错误


如果代码段仅对书籍引用和非nil内容有效,请为这些条件添加验证。如果在某些情况下这些属性可能为零,请确保您的代码考虑到这一点。

那么会发生什么?考试不及格?您是否收到错误?好的,那么我是否能够在代码段工厂中定义图书工厂?我还以为他们会加入呢!也可以像创建“let!(:snippet)…”一样定义它,比如:“FactoryGirl.create(:snippet1,user\u id:user.id,book\u id:book.id)”。我不知道你的联想看起来怎么样。或者您可以在工厂中构建“关联:用户”