عودة الكائنات وهمية من الفتاة المصنع
-
09-09-2019 - |
سؤال
أنا أستخدم 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
بضع أفكار أخرى: -
- أعتقد أن تحديد التوقعات في مثل هذا المكان المخفي بعيدا ربما فكرة سيئة على أي حال.
- إذا كنت ستفعل ذلك، فسوف اعتقدت باستخدام
stubs
كان أكثر ملاءمة منexpects
. - قد يكون يستحق فصل
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