我是使用rspec的新手。我试图为这些找出正确的测试命令。
describe Person do
let(:person) do
Person.new({
first_name: "",
last_name: "",
birthdate: 30.years.ago,
gender: ""
})
end
it "is creates a new Person" do
create(:person).should be_valid
end
it "has a full name" do
person {Person.new(first_name: "", last_name: "")}
person.should_not be_valid
end
我收到以下错误: 人是创建一个新的人固定。 预计等待“请测试我”失败。没有引起错误
答案 0 :(得分:1)
在您的第一个示例中,您实际上想要检查是否可以保存您之前已经实例化过的记录。那你为什么不打电话给save!
并希望你的代码不会返回任何错误?当您要保存记录时,不能总是依赖valid?
。
我的方法看起来像
expect{ person.save! }.to_not raise_error(ActiveRecord::RecordInvalid)
注意:save!
会引发错误,而save
只会返回false
您的第二个示例同样不精确,因为您只是在尝试为其分配两个属性后询问您的记录是否有效。如果它说"否,则无效。"你的测试会通过,但它可能会因错误的原因而通过。如果您致电valid?
,ActiveRecord会在记录中添加错误(如果有)。那你为什么不在这里要求具体的错误呢?
person.valid?
expect{ person.errors }.to include("first_name and last_name can't be blank")
通过这种方式,您确实会确保导致预期的行为,如果您有另一个无意的错误,您的测试将无法通过。
答案 1 :(得分:0)
对于create
类方法,您不应该传递Person实例,您应该只传递属性的哈希值。
describe Person do
let(:person_attributes) do
{ first_name: "", last_name: "", birthdate: 30.years.ago, gender: "" }
end
it "is creates a new Person" do
create(:person_attributes).should be_valid
end
...
在第二个示例中,如果您未使用let
,则应进行直接分配
it "has a full name" do
person = Person.new(first_name: "", last_name: "")
person.should_not be_valid
end