Вопрос

Я использую Mocha и Factory_girl в железнодорожном приложении JRuby.Когда я звоню на фабрику, я хотел бы вернуть предметы уже с некоторыми издевательствами.Вот фрагмент кода того, что я пытаюсь сделать.

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

Поскольку я не хочу, чтобы мой модульный и функциональный тест фактически извлекался из API Twitter, я хочу заглушить метод, чтобы он возвращал то, что я хочу.Но это не работает.Объект возвращается без каких-либо заглушек.Есть ли способ на самом деле выполнить заглушку объекта, созданного с помощью Factory Girl, прежде чем он будет возвращен вам?

Это было полезно?

Решение

Глядя на документацию и исходный код для 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