在RSpec中使用expect和should

时间:2014-02-27 11:15:35

标签: ruby-on-rails ruby rspec

有以下RSpec代码:

it 'is not valid if name is not present' do
    @car.name = nil
    expect(@car).to be_invalid
end

我现在读了Aaron Sumner的“用RSpec测试”,他在RSpec中写了新的风格。之前我写过以下代码:

it 'is not valid if name is not present' do
    @car.name = nil
    it { should_not be_valid }
end

请告诉我,对吗?谢谢。

2 个答案:

答案 0 :(得分:12)

我认为这是一个很好的例子

describe "Car"
  describe '#valid?' do
    context 'when its name is nil' do
      let(:car) { FactoryGirl.create(:car, :name => nil) }

      it 'is not valid' do 
        expect(car).to_not be_valid
      end
    end
  end
end

详细了解更好的规格here

答案 1 :(得分:3)

使用let API代替使用@car,这样您就不会冒险将状态从测试更改为测试,其方式可能会以不可预测的方式破坏测试。

it one-liner指的是subject,所以为了使你的第二个样式工作,它应该是这样的:

describe '#valid?' do
  let(:car) do
    # make your car here
  end

  subject { car } # <- this is the important line to make it work...

  before do
    car.name = nil
  end

  it { should_not be_valid }
end