2013-02-15 3 views
0

Я хочу, чтобы те уже методы были протестированы, но все, что я стараюсь, похоже, не соответствует лучшим практикам и не работает.Метод экземпляра тестирования Rspec, который требует других методов return (stubbing?)

Может быть, кто-нибудь может поддержать меня этим?

КОД Для тестирования

def any_subset_greater? 
    divisors_sums.any?{|sum| sum > @value} 
end 

def no_subset_equal? 
    !divisors_sums.any?{|sum| sum == @value} 
end 

def check_room 
    any_subset_greater? && no_subset_equal? 
end 

Rspec TRY

сначала указать, похоже, не установить правильные значения возврата для метода делителей и переменной @value экземпляра.

describe "#any_subset_greater?" do 
    # Examples: 
    # [1,2] > 4 #=> false 
    # [1,2,3] > 4 #=> true 
    specify "returns true, when value in the array is greater" do 
    number.stub(:divisors){[1,2,3]} 
    number.stub(:value) {4} 
    expect(number.any_subset_greater?).to be_true 
    end 

end 

describe "#no_subset_equal?" do 
    # Examples: 
    # 4 === [1,2,4] #=> false 
    # 4 === [1,2,3] #=> false 
    # 4 === [1,2,6] #=> true 
end 

describe "#check_room" do 
    # testing condition from methods above 
end 
+1

Это похоже на тонкую оболочку, но что вы пытаетесь описать методы? –

+1

Откуда берется 'divisor_sums'? Кроме того, вы не должны использовать 'mock' для тестируемого объекта, так как он не содержит ваш логический код. –

+0

@dave: да ... Я хотел попробовать это на самом деле, но все, что я делаю, похоже, довольно не прав. когда я заглушу дивизоры со значением, Аарон: Я не знаю, как ... попробовал пару вещей ... какой-нибудь ключ? не могли бы вы привести пример издевательства над этим? – radosch

ответ

1

Не зная, как настроен ваш объект, этот ответ является лишь предположением. Я собираюсь предположить, что ваш объект будет выглядеть примерно так:

class SpecialNumber 
    attr_reader :divisor_sums 

    def initialize(n) 
    @value = n 
    # @divisor_sums is calculated here 
    end 

    # rest of your methods 
end 

Так что с этим объектом в виду, первый набор тестов может выглядеть следующим образом:

subject(:special_number) { SpecialNumber.new 4 } 

describe "#any_subset_greater?" do 
    context "no divisor sums greater than value" do 
    it do 
     special_number.stub(:divisor_sums).and_return [1, 2] 

     expect(special_number.any_subset_greater?).to be_false 
    end 
    end 

    context "one divisor sum greater than value" do 
    it do 
     special_number.stub(:divisor_sums).and_return [1, 2, 5] 

     expect(special_number.any_subset_greater?).to be_true 
    end 
    end 

    context "several divisor sums greater than value" do 
    it do 
     special_number.stub(:divisor_sums).and_return [1, 2, 5, 6] 

     expect(special_number.any_subset_greater?).to be_true 
    end 
    end 
end 

Но вы не должны шлейфом это. Если это простой класс, просто каждый раз создается новый объект, ожидающий делителей:

describe "#any_subset_greater?" do 
    context "no divisor sums greater than value" do 
    it do 
     expect(SpecialNumber.new(3).any_subset_greater?).to be_false 
    end 
    end 
end 
+0

эй, большое спасибо! Есть ли причина, почему вы используете описание> context> it вместо описания> укажите (с комментарием) Я узнал, что я пропустил его в неправильном месте (facepalm). Я просто отправлю решение, которое работает для меня ниже. – radosch

+0

'define' является псевдонимом для' it'. Для меня использование контекста предоставляет семантический смысл. В конце концов, это личное предпочтение. Особенно для тестов это прямо. –

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