我正在建立一个每日交易rails应用程序,我已经按照M. Hartl教程设置了一些rspec测试。
对于用户而言,他们的工作非常完美。
但是现在我已经将它用于模型Eals并且所有人都在通过,而他们不应该。例如,在我的模型中,我认为标题不能超过200个字符(注意:在我看来,当我尝试设置比这更长的标题时,它起作用并警告我这是不可能的)
但是当我进行测试时,无论我是否尝试使用long =“a”* 50,a * 201甚至是* 10000在标题测试中进行标题字符长度的测试,它总是通过!我无法找到一个大问题。 实际上所有其他测试都有同样的问题:它们总是通过!
这是我的模特/ deal.rb
class Deal < ActiveRecord::Base
belongs_to :admin_user
attr_accessible :url_path,
:country,
:title,
:description,
:twitter_msg,
:admin_user_id
validates :url_path,
presence: true,
uniqueness: { :case_sensitive => false }
validates :country,
:inclusion => { :in => ['France', 'Germany', 'United States'],
:message => "%{value} is not a valid country. " }
validates :title,
presence: true,
length: { maximum: 200,
:message => "Your title has %{value} characters but must be shorter than 200 characters" }
validates :description,
presence: true,
length: { maximum: 500,
:message => "Your title has %{value} characters but must be shorter than 500 characters" }
validates :twitter_msg,
presence: true,
uniqueness: { :case_sensitive => false }
validates :admin_user_id, presence: true
我的deal_spec.rb:
require 'spec_helper'
describe Deal do
let(:admin_user) { FactoryGirl.create(:admin_user) }
before (:each) do
@attr = { url_path: "lorem ipsum",
country:"France",
title: "lorem ipsum",
description:"lorem ipsum",
twitter_msg:"lorem ipsum",
}
end
it { should respond_to(:url_path) }
it { should respond_to(:country) }
it { should respond_to(:title) }
it { should respond_to(:description) }
it { should respond_to(:twitter_msg) }
describe "title test" do
it "should reject deals with title that is too long" do
long = "a" * 50
hash = @attr.merge(:title => long)
Deal.new(hash).should_not be_valid
end
[other tests]
end #end of title test
如果有人可以帮助我理解这一点,那就太好了,我花了好几个小时没有任何线索。
在听完某人的建议后,我用
改变了我的测试Deal.new(hash).should have(1).error_on(:title)
describe "test" do
it "should reject games with title that is too long" do
long = "a" * 250
hash = @attr.merge(:title => long)
Game.new(hash).should have(1).error_on(:title)
end
end
但是现在它一直在传递,即它告诉我标题上有一个错误,无论我把long =“a”* 5,long =“a”* 300 ......
答案 0 :(得分:4)
这不是使用RSpec测试验证的正确方法,因为它不会告诉您对象无效的原因。它可能无效,因为您错过了与您正在测试的属性完全不同的属性。您应该使用have(x).errors_on(y)
断言:
Deal.new(hash).should have(1).error_on(:title)
答案 1 :(得分:1)
我建议使用shoulda_matchers来测试此类内容
答案 2 :(得分:1)
您可以尝试以下代码吗?它应该提示你哪个属性无效(以及为什么):
it "..." do
d = Deal.new(@attr)
d.valid?
puts d.errors.full_messages
end
答案 3 :(得分:0)
admin_user_id
不在您的@attr
哈希中。但是,它对您的Deal
模型是强制性的 - 所以您的测试总是会通过,因为新协议无效。与标题的长度无关。