一种集合数据结构在Ruby中的TDD实现

一种集合数据结构在Ruby中的TDD实现,ruby,rspec,set,tdd,Ruby,Rspec,Set,Tdd,我正在尝试使用rspec在Ruby中实现一个set数据结构。在下面的代码中,我有一个测试似乎没有通过: def add(element) if @set_data.include?(element) print "This element is already in the set!" else @set_data += [element] end end 这是对它的测试: it 'does not add an element if t

我正在尝试使用rspec在Ruby中实现一个set数据结构。在下面的代码中,我有一个测试似乎没有通过:

def add(element)
    if @set_data.include?(element)
        print "This element is already in the set!"
    else
        @set_data += [element]
    end
end
这是对它的测试:

it 'does not add an element if the element is already in the set' do
    set = SetDataStructure.new([1,2,3,4,5])
    set.add(4)
    expect(set).to eq("This element is already in the set!")
end
运行测试的输出:

……此元素已在集合中!F

失败:

1) 如果元素已在集合中,则SetDataStructure不会添加该元素 失败/错误:expect(set.to_a).to eq(“此元素已在集合中!”)

应为:“此元素已在集合中!”
得到:[1,2,3,4,5]
(使用==进行比较)
#./spec/set_data_structure_spec.rb:39:in'block(2层)in'
在0.00348秒内完成 8例,1例失败

失败的示例:

rspec./spec/set_data_structure_spec.rb:36#如果元素已经在集合中,则SetDataStructure不会添加元素

我还将代码发布在我的网站上


如果有人能启发我,我将万分感激

你的期望不正确

expect(set).to eq("This element is already in the set!")
您的集合保持不变,您不希望它更改为字符串。 这应该是

it 'does not add an element if the element is already in the set' do
  set = SetDataStructure.new([1,2,3,4,5])
  expect { set.add(4) }.to output(/This element is already in the set!/).to_stdout
  # test that set has stayed the  same
  # you probably need to define (override) eq method for SetDataStructure
  expect(set).to eq(SetDataStructure.new([1,2,3,4,5]))
  # alternative is this
  expect(set.set_data).to eq([1,2,3,4,5])
end
Ruby的集合不会打印任何错误,它只是默默地不向集合添加元素。如果您想要这种行为,那么在添加元素时,期望set保持不变

it 'does not add an element if the element is already in the set' do
  set = SetDataStructure.new([1,2,3,4,5])
  (1..5).each { |n| set.add(n) }
  expect(set).to eq(SetDataStructure.new([1,2,3,4,5]))
end

你的期望是错误的

expect(set).to eq("This element is already in the set!")
您的集合保持不变,您不希望它更改为字符串。 这应该是

it 'does not add an element if the element is already in the set' do
  set = SetDataStructure.new([1,2,3,4,5])
  expect { set.add(4) }.to output(/This element is already in the set!/).to_stdout
  # test that set has stayed the  same
  # you probably need to define (override) eq method for SetDataStructure
  expect(set).to eq(SetDataStructure.new([1,2,3,4,5]))
  # alternative is this
  expect(set.set_data).to eq([1,2,3,4,5])
end
Ruby的集合不会打印任何错误,它只是默默地不向集合添加元素。如果您想要这种行为,那么在添加元素时,期望set保持不变

it 'does not add an element if the element is already in the set' do
  set = SetDataStructure.new([1,2,3,4,5])
  (1..5).each { |n| set.add(n) }
  expect(set).to eq(SetDataStructure.new([1,2,3,4,5]))
end

如果您确实希望在元素已经存在的情况下从
add
方法返回字符串,您可以修改您的方法和测试,如下所示:

方法:

def add(element)
  if @set_data.include?(element)
    "This element is already in the set!"     # This will not print the statement, but return it
  else
    @set_data += [element]
  end
end
测试:


如果您确实希望在元素已经存在的情况下从
add
方法返回字符串,您可以修改您的方法和测试,如下所示:

方法:

def add(element)
  if @set_data.include?(element)
    "This element is already in the set!"     # This will not print the statement, but return it
  else
    @set_data += [element]
  end
end
测试:


非常感谢你的帮助!非常感谢你的帮助!谢谢你的解释!:D@pinglinh-你应该投票选出你认为有用的答案,并选择最好的答案。我们会为每一次投票和每一个被接受的答案获得声誉分数。嗨,Marko,我相信我已经获得了,但不会显示出来,因为我没有15个声誉:(谢谢你的解释!:D@pinglinh-你应该对你认为有帮助的答案进行投票,并选择最好的答案。我们会为每一次投票和每一个被接受的答案获得声誉分数。嗨,Marko,我相信我已经获得了,但它不会显示出来,因为我没有15个声誉:(