如何在rails 3和rspec的before块中使用@valid_attributes?

时间:2012-01-12 02:51:32

标签: ruby-on-rails-3 rspec rspec-rails

我正在尝试使用Rails 3和RSpec的不同博客。是的,它在Windows上,所以答案不是没有使用Windows。别无选择。继续......

我可以使用rspec spec或rake spec:models运行规范,这样看起来很好。但是,如果我尝试使用带有属性的before块,则在创建具有这些属性的Person类时会失败。其他测试只是显示规格可以运行。

制作人物模型,然后更新规范

\ MYAPP \规格\模型\ person_spec.rb

require 'spec_helper'

describe Person do

  before(:each) do
    @valid_attributes = {
      :first_name => "Foo", 
      :last_name => "Bar"
    }
  end

  it "should create a new instance given valid attributes" do
    Person.create!(@valid_attributes)
  end

  it "can be instantiated" do
    Person.new.should be_an_instance_of(Person)
  end

  it "can be saved successfully" do
    Person.create.should be_persisted
  end



  #pending "add some examples to (or delete) #{__FILE__}"
end

这是rake spec:models命令

的输出
C:\Users\laptop\Documents\Sites\myapp>rake spec:models
C:/Ruby193/bin/ruby.exe -S rspec ./spec/models/person_spec.rb

Person
←[31m  should create a new instance given valid attributes (FAILED - 1)←[0m
←[32m  can be instantiated←[0m
←[32m  can be saved successfully←[0m

Failures:

  1) Person should create a new instance given valid attributes
     ←[31mFailure/Error:←[0m ←[31mPerson.create!(@valid_attributes)←[0m
     ←[31mActiveRecord::UnknownAttributeError:←[0m
       ←[31munknown attribute: first_name←[0m
←[36m     # ./spec/models/person_spec.rb:13:in `block (2 levels) in <top (required)>'←[0m

Finished in 0.074 seconds
←[31m3 examples, 1 failure←[0m

Failed examples:

←[31mrspec ./spec/models/person_spec.rb:12←[0m ←[36m# Person should create a new instance given valid attributes←[0m
rake aborted!
C:/Ruby193/bin/ruby.exe -S rspec ./spec/models/person_spec.rb failed

因此,有三分之二通过了没有属性的那个。

特别需要为之前的块运行设置或者在Rails 3的测试中如何传递属性?

还有办法摆脱那些31米和每个规格线的打印输出吗?

由于

2 个答案:

答案 0 :(得分:0)

从错误中可以看出,ActiveRecord无法找到属性:first_name,它是作为@valid_attributes的一部分传递的。也就是说,问题不在于您如何使用RSpec,而在于您希望包含有效模型的属性。

检查Person模型上是否有:first_name字段或属性 - 并验证确切的拼写(:first_name vs:firstname或其他一些变体)

答案 1 :(得分:0)

我应该用答案更新这个。

Person模型确实包含first_name和last_name,但正如我收到的错误上面的两个人所指出的那样,指向ActiveRecord没有找到它。

在Windows中,运行rake db:migrate两次或三次最终修复它,即使它在模型中没有丢失。

如果你被困在Windows开发者身上,这可能是一件好事!

我终于能够将Lubuntu放在Windows 7上的VirtualBox上,并且运行正常,从那时起我就开始了其他的例子。

干杯