2014-09-05 4 views
-1

Моя самая слабость, когда дело доходит до кодирования, использует TDD & Методы BDD - я имею тенденцию просто писать код .. но это то, над чем я пытаюсь работать.Тестирование с помощью Rspec - Правильный способ

Можно ли указать, что лучший способ идти о следующей проблеме:

Class1:

module TempMod 
    class MyClass 

     def initalize(config) 
      @config = config 
     end 

     def process(xml) 
      if react_upon? xml.something 
       puts 'yeah' 
      else 
       puts 'nah' 
      end 
     end 

     def react_upon?(xml_code) 
      #code here 
     end 

    end 
end 

Так позволяет сказать, что я хотел проверить этот класс, или построить его с точки TDD зрения поэтому я пишу свои тесты:

describe TempMod::MyClass do 

    let(:config) {double} 
    let(:myclass) {TempMod::MyClass.new config} 

    context 'Given that the xml is something we react upon' do 
     it 'should check that it is valid' do 
      myclass.process '<some><xml>here</xml></some>' 
     end 
     it 'should output yea' 
    end 
end 

Как проверить, что он вызывает response_upon? метод. Я даже хочу видеть, что это называется?

Это правильный способ проверить его, чтобы проверить все функции, такие как response_upon? самостоятельно независимо от других функций?

Это как раз то, что меня больше всего сбивает с толку. Я тестирую весь класс или просто индивидуально тестирую функции, а не их взаимодействие с другими функциями этого класса?

Также я осознаю реакцию_upon? может не придерживаться принципа единой ответственности, и я бы, вероятно, переместил его на свой собственный модуль/класс, который я мог бы проверить с помощью заглушки.

Если кто-то может пролить свет на это для меня, это было бы потрясающе.

редактировать:

describe TempMod::MyClass do 

    let (:valid_planning_status_xml) { 
    '<StatusUpdate> <TitleId>2329</TitleId> <FromStatus>Proposed</FromStatus> <ToStatus>Confirmed</ToStatus> </StatusUpdate>' 
    } 

    let(:config) { double } 

    let(:status_resolver) { double } 

    subject(:message_processor) { TempMod::MyClass.new config, status_resolver } 

    context 'Given that the message XML is valid' do 

    it 'should check the context of the message' do 
     expect(message_processor.process valid_planning_status_xml).to call :check_me 
    end 

    context 'Given that the message is for a planning event update' do 

     it 'should call something' do 
      pending 
     end 
    end 

    context 'Given that the message is for a recording job update' do 
    end 

    context 'Given that the message is for a video title update' do 
    end 
    end 
end 

ответ

1

Ваш вопрос меня смутил немного это то, что вы просите

module TempMod 
    class MyClass 
    def initalize(config) 
     @config = config 
    end 
    def process(xml) 
     react_upon?(xml.something) ? 'yeah' : 'nah' 
    end 
    def react_upon?(xml_code) 
     #code here 
    end 
    end 
end 

Затем проверьте, как

describe TempMod::MyClass do 

    let(:config) {double} 
    let(:myclass) {TempMod::MyClass.new config} 

    context 'Given that the xml is something we react upon' do 
    it "should respond to react_upon?" do 
     expect(myclass).to respond_to(:react_upon?) 
    end 
    it "should react_upon? valid xml" do 
     expect(myclass.react_upon?(YOUR VALID REACTION GOES HERE)).to be_true 
    end 
    it "should not react_upon? invalid xml" do 
     expect(myclass.react_upon?(YOUR INVALID REACTION GOES HERE)).to be_false 
    end 
    it "should say 'yeah' if it is valid" do 
     expect(myclass.process('<some><xml>here</xml></some>')).to eq('yeah') 
    end 
    it "should say 'nah' if it is invalid" do 
     expect(myclass.process('<some><xml>here</some>')).to eq('nah') 
    end 
    it 'should check the context of the message' do 
     expect(myclass).to receive(:react_upon?).with('<some><xml>here</xml></some>') 
     myclass.process('<some><xml>here</xml></some>') 
    end 
    end 
end 

Прямо сейчас ваши тесты не имеют никаких ожиданий, так Я добавил один, который ожидает myclass для respiond_to метода react_upon? и другой, который ожидает, что myclass.process(xml) ответит String, который равен yeah.

+0

Извините, его попытка получить что-то в моей голове! То, что я получаю, заключается в ожидании, что вы включили, то есть тестируете весь класс (включая метод response_upon?), Так это то, как мне нужно его тестировать? или я тестирую response_upon? метод в отдельном ожидании, чтобы убедиться, что он делает то, что мне нужно от него? – Vade

+1

@ Vade Я понятия не имею, что такое response_upon? метод выглядит, но я добавил к этому ожидание. – engineersmnky

+0

вот тот! Я использовал неправильный вызов. Я использовал expect (myclass) .to had_recieved (: react_upon?) Спасибо! – Vade

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