Мое понимание заключается в том, что модульное тестирование должно тестировать классы изолированно, фокусируясь на гранулированном поведении и заменяя объекты других классов, используя, по возможности, парные/макеты. (Пожалуйста, поправьте меня, если я ошибаюсь здесь.)Как тестировать класс, который сильно зависит от других классов?
Я пишу драгоценный камень с классом под названием MatchList
. MatchList::new
принимает два аргумента, каждый экземпляр другого класса под названием MatchPhrase
. MatchPhrase
содержит некоторое поведение, которое MatchList
сильно зависит от (, т. Е., если вы кормите ничего, кроме MatchPhrase
, до MatchList::new
, вы получите кучу ошибок «неопределенного метода»).
Моя текущая (? Наивная) испытательная установка использует let
заявления для назначения переменных для использования в моих примерах:
let(:query) { MatchPhrase.new('Good Eats') }
let(:candidate) { MatchPhrase.new('Good Grief') }
let(:match_list) { MatchList.new(query, candidate) }
Как я пишу это модульное тестирование? Правильно ли я думаю, что это нужно сделать, не вызывая класс MatchPhrase
? Возможно ли это?
Для справки, вот что MatchList
класса выглядит следующим образом:
class MatchList < Array
attr_reader :query, :this_phrase, :that_phrase
def initialize(query, candidate)
super(query.length)
@query = query
@this_phrase = query.dup
@that_phrase = candidate
find_matches until none?(&:nil?)
end
private
def find_matches
query.each.with_index do |this_token, i|
next unless self[i].nil?
that_token = this_token.best_match_in(that_phrase)
next if that_token.match?(that_token) &&
this_token != that_token.best_match_in(this_phrase)
self[i] = this_token.match?(that_token) ? that_token : NilToken.new
this_phrase.delete_once(this_token)
that_phrase.delete_once(that_token)
end
end
end
Интересный вопрос. Когда это невозможно или будет слишком много работать для тестирования класса класса 'A', я обычно тестирую' A & B', 'A & C' и' A & D'. Когда все они терпят неудачу, есть сильное подозрение, что «А» является виновником.Посмотрите, что советует сообщество. –
Вы на правильном пути. Вы должны подставлять объекты других классов с помощью double/mocks, где это возможно. Это одно из преимуществ DI. – Surya