أنا أستخدم Scalacheck لتحديد الكائنات التي سيتم استخدامها في اختبارات الوحدة الخاصة بي.
val listingGen = for {
id <- posNum[Long]
name <- alphaStr
} yield Listing(id, name)
//I want that listingGen always return me a Listing
listingGen.sample.get
قد listingGen.sample
None
. كيف يمكنني فرض فحص النطاق لإرجاع Some(Listing)
؟
في الحالة العامة ، لا يمكنك ذلك. يمكن أن تفشل مولدات ScalaCheck ، على سبيل المثال إذا كنت تضيف عامل تصفية ( listingGen.suchThat(...)
) ، وهذا الفشل على غرار النوع Option
. ومع ذلك ، إذا كنت متأكدًا من أن المولد الخاص بك لن يفشل أبدًا ، فيمكنك ببساطة الاتصال بـ Option.get
كما تفعل في المثال أعلاه. أو يمكنك استخدام Option.getOrElse
لاستبدال None
بقيمة افتراضية.
إذا كنت تعلم أن المولد الخاص بك قد يفشل ، ولكن نادرًا ما يمكنك استخدام Gen.retryUntil(_ => true)
. سيؤدي هذا ببساطة إلى إعادة تشغيل المولد إذا فشل. يجب أن تكون حذرًا في هذا الأمر ، حيث قد ينتهي بك الأمر في حلقة غير منتهية.
يبدو مثل هذا ينبغي فقط أن تكون مغلقة؟
👍
التعليق الأكثر فائدة
في الحالة العامة ، لا يمكنك ذلك. يمكن أن تفشل مولدات ScalaCheck ، على سبيل المثال إذا كنت تضيف عامل تصفية (
listingGen.suchThat(...)
) ، وهذا الفشل على غرار النوعOption
. ومع ذلك ، إذا كنت متأكدًا من أن المولد الخاص بك لن يفشل أبدًا ، فيمكنك ببساطة الاتصال بـOption.get
كما تفعل في المثال أعلاه. أو يمكنك استخدامOption.getOrElse
لاستبدالNone
بقيمة افتراضية.إذا كنت تعلم أن المولد الخاص بك قد يفشل ، ولكن نادرًا ما يمكنك استخدام
Gen.retryUntil(_ => true)
. سيؤدي هذا ببساطة إلى إعادة تشغيل المولد إذا فشل. يجب أن تكون حذرًا في هذا الأمر ، حيث قد ينتهي بك الأمر في حلقة غير منتهية.