2017-01-12 4 views
1

Я пытаюсь реализовать заданную структуру данных в Ruby с помощью rspec. У меня есть один тест, который, кажется, не проходит в коде ниже:TDD реализация заданной структуры данных в 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 не добавляет элемент, если элемент уже в наборе Failure/Error: ожидать (set.to_a) .то эк ("Этот элемент уже в комплекте! «)

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.

Я был бы так благодарен, если бы кто-нибудь мог просветить меня!

ответ

0

Если вы действительно хотите, чтобы вернуть строку из 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 
+0

Большое вам спасибо за вашу помощь! – pinglinh

0

Ваши ожидания неверны.

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 

набор Руби не будет печатать какие-либо ошибки, это было бы просто молча не добавляет элемент для установки. Если вы хотите, чтобы поведение, то ожидать множество остаться такой же, когда вы добавляете элемент

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 
+0

Спасибо за ваше объяснение! : D – pinglinh

+0

@pinglinh - вы должны перенести ответы, которые вы найдете полезными, а также выбрать лучший. Мы получаем очки репутации за каждый взнос и за каждый принятый ответ. –

+0

Привет, Марко, я считаю, что у меня уже есть, но он не будет показан, так как у меня нет 15 репутации :( – pinglinh

Смежные вопросы