Как проверить методы класса в RSPEC - PullRequest
17 голосов
/ 04 ноября 2011

Я написал простой метод класса Buy.get_days(string) и пытаюсь проверить его с использованием различных текстовых строк. Однако я чувствую, что это очень многословно.

  • Есть ли более краткий способ проверить следующее?
  • Есть ли эквивалент subject для методов , которые я могу просто продолжать передавать разные параметры и проверить результаты?
  • Есть ли способ избежать ненужного описания у каждого it?

спасибо

 describe Buy do
   describe '.get_days' do
    it 'should get days' do
      Buy.get_days('Includes a 1-weeknight stay for up to 4 people')
      .should == 1
      end
    it 'should get days' do
      Buy.get_days('Includes a 1-night stay in a King Studio Room with stone fireplace')
      .should == 1
    end
    it 'should get days' do
      Buy.get_days('Includes 4 nights/5 days at the Finisterra Hotel for up to two adults and two children (staying in the same room)')
      .should == 4
    end
  end
end

Ответы [ 5 ]

13 голосов
/ 04 ноября 2011

Не существует эквивалента subject для вызова метода, поэтому использование it - вот способ, с помощью которого можно перейти сюда. Проблема, которую я вижу в представленном вами коде, заключается в том, что он не объясняет , для чего вы тестируете. Я бы написал что-то более похожее на:

describe Buy do
  describe '.get_days' do
    it 'should detect hyphenated weeknights' do
      Buy.get_days('Includes a 1-weeknight stay for up to 4 people').should == 1
    end
    it 'should detect hyphenated nights' do
      Buy.get_days('Includes a 1-night stay in a King Studio Room with stone fireplace').should == 1
    end
    it 'should detect first number' do
      Buy.get_days('Includes 4 nights/5 days at the Finisterra Hotel for up to two adults and two children (staying in the same room)').should == 4
    end
  end
end

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

11 голосов
/ 18 марта 2015

Очевидно, существует метод described_class.

https://www.relishapp.com/rspec/rspec-core/docs/metadata/described-class

Я полагаю, что он чище, чем subject.class, поскольку он не вводит еще один вызов метода ., которыйуменьшает читабельность.

Использование либо described_class, либо subject.class может быть более СУХИМ, чем упоминание класса явно в каждом примере.Но лично я думаю, что отсутствие выделения подсветки синтаксиса, которая идет с явным упоминанием имени класса, является чем-то вроде обломка, и я думаю, что это снижает читабельность, несмотря на то, что оно полностью выигрывает в отделе сопровождения.практика:

Должны ли вы использовать по возможности описанный класс внутри и вне метода .expect() или только в методе expect()?

6 голосов
/ 23 августа 2014

Это может быть старый вопрос, но вы всегда можете использовать subject.class, чтобы получить:

describe Buy do
  describe '.get_days' do
    it { expect(subject.class.get_days('Includes a 1-weeknight stay for up to 4 people')).to eq 1 }
  end
end
4 голосов
/ 09 мая 2012

Этот является интересным, хотя, возможно, более тупым способом использования блока 'subject' с методами класса.

Редактировать: Неработающая ссылка , как сообщается в Архиве Wayback, который, я полагаю, подвержен той же проблеме.

0 голосов
/ 23 октября 2013

Альтернативой использованию subject / it является использование before / specify:

describe '#destroy' do
  context 'with children' do
    before { @parent = FactoryGirl.create(:parent, children: FactoryGirl.create_list(:child, 2) }
    specify { @parent.destroy.should be_false }
  end
end

Это даст разумное описание в формате вывода -fd RSpec:

#destroy
  with children
    should be false
...