在rspec的测试定义中使用变量

时间:2013-09-06 13:27:50

标签: rspec

我不确定如何在测试说明中提供在前一块中定义的变量。这就是我的意思。

context "name" do
  before do
    @min_size = 1
    @max_size = 255
  end
  context "is valid when it" do
    it "has #{@min_size} character" do
      expect(create(:person, name: Faker::Lorem.characters(@min_size))).to be_valid
    end
    it "has #{@max_size} characters" do
      expect(create(:person, name: Faker::Lorem.characters(@max_size))).to be_valid
    end
    it "has between #{@min_size} and #{@max_size} characters" do
      expect(create(:person, name: Faker::Lorem.characters((@min_size + @max_size)/2))).to be_valid
    end
  end
end

3次测试通过,但这是输出打印的方式。注意缺少的最小值和最大值。

name
  is valid when it
    has  character
    has  characters
    has between  and  characters

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

context "name" do
  min_size = 1
  max_size = 255

  before do
    @min_size = min_size
    @max_size = max_size
  end

  context "is valid when it" do
    it "has #{min_size} character" do
    ...

注意忽略{@ 1}}中的“@”签名。

答案 1 :(得分:1)

我不知道它是否比第一个答案更多或更少令人困惑,但考虑到在RSpec测试中不使用实例变量的好处(即因为如果未定义它们评估为nil),可以使用let代替before,这允许您在整个示例中使用相同的变量。

context "name" do
  min_size = 1
  max_size = 255

  let(:min_size) {min_size}
  let(:max_size) {max_size}

  context "is valid when it" do
    it "has #{min_size} character" do
    ...