문제

Jruby Rails 응용 프로그램에서 Mocha와 Factory_girl을 사용하고 있습니다. 공장을 호출 할 때 이미 조롱을 한 상태에서 물체를 반환하고 싶습니다. 다음은 내가하려는 일에 대한 코드 스 니펫입니다.

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
  t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end

내 장치와 기능 테스트가 실제로 트위터 API에서 가져 오는 것을 원하지 않기 때문에 메소드를 스텁하고 싶습니다. 그러나 이것은 작동하지 않습니다. 객체는 스터브하지 않고 돌아옵니다. 공장 소녀가 당신에게 돌아 오기 전에 실제로 스터브를 수행 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

문서 및 소스 코드를보고 있습니다 factory_girl, 물체가 블록에 산출 한 것처럼 보입니다 (t, 당신의 예에서) Factory 그리고 당신이 구성하려는 객체의 인스턴스가 아닙니다 ( tweet_feed_with_tweets, 당신의 예에서). 이것은에 대한 기대를 설정한다는 것을 의미합니다 pull_tweets 메소드 켜짐 t 에 대한 기대치를 설정하고 있습니다 Factory 인스턴스가 아니며 전화 할 때 구성 될 객체가 아닙니다. Factory(:tweet_feed_with_tweets). 나는 이것이 당신의 예가 당신이 기대하는대로 작동하지 않는 이유를 설명한다고 생각합니다.

나는 틀릴 수도 있지만 내에서 기대치를 추가하는 방법을 볼 수 없습니다. Factory.define 차단하다. 당신은 이미 이것에 대해 생각했지만, 인스턴스를 구성한 후 테스트에 기대치를 추가하는 것이 더 나을 것이라고 생각합니다.

def test_should_do_something
  tweet_feed = Factory(:tweet_feed)
  tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
  # test stuff here
end

여러 곳 에서이 작업이 필요한 경우 방법으로 추출 할 수 있습니다.

def test_should_do_something
  tweet_feed = build_tweet_feed_with_tweets
  # test stuff here
end

private

def build_tweet_feed_with_tweets
  tweet_feed = Factory(:tweet_feed)
  tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
  return tweet_feed
end

몇 가지 다른 생각 :-

  1. 나는 그런 숨겨진 곳에서 기대치를 설정하는 것이 어쨌든 나쁜 생각이라고 생각합니다.
  2. 당신이 그것을하려고한다면, 나는 stubs 보다 더 적합했습니다 expects.
  3. 분리 할 가치가있을 수 있습니다 pull_tweets 방법 (및 유사한 방법)으로의 TwitterAPI 수업. 그렇게하면 그렇게 나쁘지 않은 것처럼 보이지 않을 것입니다. TwitterAPI 시험에서.

그 중 일부가 도움이되기를 바랍니다.

다른 팁

이제 콜백을 사용할 수 있습니다.

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
  t.after_build do |tt|  
    tt.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
  end
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top