سؤال

أنا أستخدم Mocha و Factory_Girl في تطبيق Rails 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, ، يبدو أن الكائن أسفر عن الكتلة (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