콘솔 출력값은 어떻게 테스트 해야 하나요?

2013-12-02 11:33

루비로 예를 들어 보겠습니다. 친구를 만나면 인사하는 로직이 있다고 해봅시다. 다음은 Person.rb의 일부입니다.

  def meet(other)
    puts other.name + '님, 안녕하세요' if is_friend?(other)
  end

여기서 meet 메서드를 테스트 하려면 어떻게 해야할까요? 저같은 경우엔 다음과 같이 수정했습니다.

  def meet(other)
    @msg = other.name + '님, 안녕하세요' if is_friend?(other)
  end


  def speak
    puts @msg
    @msg = ''
  end

이렇게 하면 @msg의 값으로 테스트할 수 있습니다. 이보다 더 좋은 방법이 있을까요?

BEST 의견 원본위치로↓
2013-12-02 12:24

나도 일반적으로는 질문에서 제시한 방식으로 테스트한다. 콘솔의 경우에는 가장 쉬운 방법일 듯하다.

하지만 return 값이 없은 다른 메소드는 어떻게 하는 것이 좋을까? 자바의 경우 return 값이 없는 method의 경우 mockito와 같은 mock framework을 사용하면 verify 라는 메소드를 통해 현재 메소드의 호출 상태를 테스트할 수 있다.

위의 경우도 meet 메소드를 호출할 경우 puts에 인지로 어떤 값이 전달되는지를 검증함으로써 정상적으로 구현되었는지를 파악할 수 있다. ruby의 경우 이와 관련해 훨씬 더 유연한 방식으로 처리할 수 있지 않을까 생각한다. 나도 ruby 경험이 짧아서 딱히 모르겠는데 찾아보면 있을 듯하다. 같이 함 찾아보자.

2개의 의견 from SLiPP

2013-12-02 12:24

나도 일반적으로는 질문에서 제시한 방식으로 테스트한다. 콘솔의 경우에는 가장 쉬운 방법일 듯하다.

하지만 return 값이 없은 다른 메소드는 어떻게 하는 것이 좋을까? 자바의 경우 return 값이 없는 method의 경우 mockito와 같은 mock framework을 사용하면 verify 라는 메소드를 통해 현재 메소드의 호출 상태를 테스트할 수 있다.

위의 경우도 meet 메소드를 호출할 경우 puts에 인지로 어떤 값이 전달되는지를 검증함으로써 정상적으로 구현되었는지를 파악할 수 있다. ruby의 경우 이와 관련해 훨씬 더 유연한 방식으로 처리할 수 있지 않을까 생각한다. 나도 ruby 경험이 짧아서 딱히 모르겠는데 찾아보면 있을 듯하다. 같이 함 찾아보자.

2013-12-02 13:13

java의 mockito와 비슷한게 ruby에서 mocha라는 젬이 있네요. 바로 적용해 봤습니다!

Gemfile의 일부

gem 'test-unit'
gem 'mocha'

person_test.rb의 일부

require 'test/unit'
require 'mocha/setup'
require '../lib/person'


class PersonTest < Test::Unit::TestCase
  setup do
    @p1 = Person.new('인간1')
    @p2 = Person.new('인간2')
  end


  test '친구가 아닌 사람을 만나면 인사하지 않는다' do
    @p1.expects(:puts).never
    @p1.meet(@p2)
  end


  test '친구를 만나면 인사한다' do
    @p1.has_friendship_with(@p2)
    @p1.expects(:puts).with('인간2님, 안녕하세요')
    @p1.meet(@p2)
  end
end

person.rb의 일부

def meet(other)
    puts other.name + '님, 안녕하세요' if has_friendship_with?(other)
end
의견 추가하기

연관태그

← 목록으로