下午全部,
我刚刚开始学习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
答案 0 :(得分:1)
我认为你的snippet1工厂应该有user_id或类似的东西。现在你创建10个没有关联的片段
修改:现在我看了你的编辑。但雇佣几乎是一样的。你的snippet1工厂没有任何书,所以这个错误
self.book.size.to_i
答案 1 :(得分:1)
您的let(:snippet)
子句使用:book1
属性,但代码正在检查self.book
- 这可能是吗?
无论哪种方式,您列出的snippet.rb摘录都有两个对.size
的引用 - 在不知道您的行号的情况下,我们很难判断哪一个引发错误。
因此book属性或content属性返回nil - 所以当你在nil属性上调用size时,你会得到正在发生的错误。
如果代码段仅对书籍参考和非零内容有效,请为这些条件添加验证。如果有些情况 可能为零,请确保您的代码允许这样做。