Rspec测试条件

时间:2014-07-20 23:59:14

标签: ruby-on-rails-4 rspec

我是使用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

我收到以下错误: 人是创建一个新的人固定。 预计等待“请测试我”失败。没有引起错误

2 个答案:

答案 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