一种集合数据结构在Ruby中的TDD实现
我正在尝试使用rspec在Ruby中实现一个set数据结构。在下面的代码中,我有一个测试似乎没有通过:一种集合数据结构在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
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个声誉:(