Вы издеваетесь над издевательством. Одно из правил, которое следует строго соблюдать, - не издеваться над тестируемым устройством, поэтому вместо
describe CardGame do
let(:card) { instance_double(CardGame,
name: 'poker',
response: 'hello')}
let(:deck_klass) { class_double(Deck, build: ['Ace', 'Queen']).as_stubbed_const }
context 'attributes' do
it 'should have a name' do
expect(card.name).to eq('poker')
end
end
end
сделайте это
describe CardGame do
let(:card) { CardGame.new(name) }
let(:name) { 'poker'}
context 'attributes' do
it 'should have a name' do
expect(card.name).to eq('poker')
end
end
end
Почему бы вам не высмеять тестируемое устройство?
context '#response method' do
it 'should say hello' do
allow(card).to receive(:response).and_return('hello')
expect(card.response).to eq('hello')
end
end
Потому что в этом примере вы только тестируете, что фреймворк RSpe c работает. Упростите его
context '#response method' do
it 'should say hello' do
expect(card.response).to eq('hello')
end
end
Последний пример:
context '#start method' do
it 'can only implement class methods that are defined on a class' do
expect(deck_klass).to receive(:build)
card.start
expect(card.cards).to eq(['Ace', 'Queen'])
end
end
Выглядит лучше, проверенный класс не тестируется напрямую, а используется тестируемым модулем (Card
).
Если вы изучаете RSpe c - постарайтесь высмеивать как можно меньше. Это заставит вас создавать свои классы, чтобы их было легко тестировать. Прямо сейчас вы разрабатываете его в своем старом привычном стиле, что делает класс трудным для тестирования, что вынуждает вас использовать насмешки (и поскольку вы только учитесь - легко не заметить место c, где вас нет ничего не проверяю)