هل هناك شيء في الاختبار يشبه توقع_no_warnings()؟

StackOverflow https://stackoverflow.com//questions/22003306

  •  20-12-2019
  •  | 
  •  

سؤال

أنا أكتب اختبارات لوظيفة تؤدي في بعض الظروف إلى ظهور تحذيرات.أريد التأكد من أنه في ظل الظروف الأخرى لا ينتج عنه تحذيرات.لا أرى طريقة واضحة لاختبار ذلك بسهولة testthat.أعتقد أنه يمكنني فعل شيء مثل:

my.result <- 25
my.func <- function() my.result
expect_equal(
  withCallingHandlers(
    my.func(), warning=function() stop("A Warning!")
  ), 
  my.result
)

او استعمل options(warn=2), ولكن كنت أتمنى أن يكون هناك شيء مثل:

expect_no_warnings(my.func())

هل أفتقد شيئًا واضحًا؟

هل كانت مفيدة؟

المحلول

حتى في الإصدارات الأحدث من ´testthat´ (من 0.11.0) يمكنك ان تفعل:

expect_warning(my.func(), regexp = NA)

من توثيق expect_error

التعبير العادي:التعبير العادي لاختبار ضد.إذا تم حذفه، فإنه يؤكد فقط أن التعليمات البرمجية تنتج بعض المخرجات أو الرسائل أو التحذير أو الخطأ.وبدلاً من ذلك، يمكنك تحديد NA للإشارة إلى أنه لا ينبغي أن يكون هناك أي مخرجات أو رسائل أو تحذيرات أو أخطاء.

وبنفس الطريقة يمكنك اختبار عدم وجود رسائل وأخطاء ومخرجات.

نصائح أخرى

في الإصدارات الأخيرة من testthat، يمكنك ببساطة القيام بما يلي:

expect_that(my.func(), not(gives_warning()))

تحديث: يستخدم expect_silent() في الوقت الحاضر بسبب expect_that تم إهماله، راجع المساعدة الخاصة بالوظيفة!.

التحديث 2: كما ذكر @eaglefreeman الجواب باستخدام expect_warning مع المعلمة regexp ضبط ل NA هو الحل الأفضل لأن إجابتي تتسبب في فشل الاختبار حتى لو لم يتم رفع أي تحذير ولكن تمت طباعة رسالة فقط.ليس هذا ما أراده البروتوكول الاختياري (ولكن فقط تجاهل التحذيرات).لا أحذف هذه الإجابة لتوضيح هذا الاختلاف للقراء الآخرين.

من أمثلة المساعدة:

expect_silent("123")

f <- function() {
  message("Hi!")
  warning("Hey!!")
  print("OY!!!")
}

expect_silent(f())

تحذير: expect_silent لا تتوقع أيضًا أي مخرجات لذا فإن الدلالات مختلفة قليلاً!

يمكنك التحقق مما إذا كان expect_warning() فشل.ما يلي يحل مشكلة النوع الآخر من المخرجات التي يتم إنتاجها بواسطة my.func() و not() يتم إهمالها:

expect_failure(expect_warning(my.func()))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top