带有let和subject功能的RSpec

时间:2014-04-23 10:58:35

标签: ruby-on-rails rspec

有以下规格:

要求' spec_helper'

describe Place do
  let(:place) { FactoryGirl.create(:place) }

  subject { place }

  it { expect be_valid }

  describe 'when content is not present' do
    before { place.content = nil }
    it { expect be_valid }
  end
end

此外,还有Place模型中的状态内容验证。但是这个规范并没有抛出任何异常,即使最后一条指令设置了内容'没有。有什么麻烦?谢谢。

2 个答案:

答案 0 :(得分:1)

你只是设定了一个期望但从不打电话给任何人。 用

替换你期望的be_valid调用
it { expect(subject).to be_valid }
...
it { expect(place).to be_valid }

我猜你是来自旧的语法。你可以按照你的方式编写它:

it { should be_valid }

但是较新的期望语法表现略有不同

答案 1 :(得分:0)

您有let(:place) { FactoryGirl.create(:place) },因此当您第一次引用place时,它会创建一个实例(包含有效内容)。您正在更改content,但未对其执行验证。

有几种方法可以满足您的需求:

  1. 使用您已有的工厂,而不是create使用build

  2. FactoryGirl定义无效工厂:

    factory :place do
      content 'valid value'
      factory :invalid_place do
        content nil
      end
    end
    
  3. 3)或者您可以使用attributes_for