【问题标题】:TDD implementation of a set data structure in RubyRuby中集合数据结构的TDD实现
【发布时间】:2017-05-28 05:16:28
【问题描述】:

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

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("这个元素已经在集合中!")

   expected: "This element is already in the set!"
        got: [1, 2, 3, 4, 5]

   (compared using ==)
 # ./spec/set_data_structure_spec.rb:39:in `block (2 levels) in <top (required)>'

在 0.00348 秒内完成 8 个例子,1 个失败

失败的例子:

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

我的GitHub 上也发布了代码。

如果有人能启发我,我将不胜感激!

【问题讨论】:

    标签: ruby rspec set tdd


    【解决方案1】:

    如果你真的想从 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
    

    测试:

    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 eq("This element is already in the set!")
    end
    

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    你的预期不正确。

    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 不会打印任何错误,它只是默默地不向 set 添加元素。如果你想要这种行为,那么当你添加元素时希望 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
    

    【讨论】:

    • 感谢您的解释! :D
    • @pinglinh - 你应该投票赞成你认为有帮助的答案,并选择最好的答案。我们会为每一个支持和每一个接受的答案获得声誉积分。
    • 嗨,Marko,我相信我已经有了,但它不会显示,因为我没有 15 声望 :(
    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多