Игнорировать "требуют" и утверждения во время тестов с ScalaCheck?
Наши тематические классы имеют несколько require
операторы для выдачи исключений, когда они получают некорректный ввод. Это обычно довольно полезно, но может затруднить написание тестов на основе свойств, поскольку нам нужно писать генераторы, которые удовлетворяют всем требованиям, а не просто использовать встроенные генераторы. Есть ли простой способ заставить Scala игнорировать операторы require во время тестирования?
2 ответа
Намного лучше было бы избежать require
целиком и вместо этого напишите умные конструкторы, которые возвращают Either
(или же Validation
если вы склонны к скалазу. Лучше было бы создать упаковщики нового типа (т.е. case class MyWrapper private (i: Int) extends AnyVal
) для ваших типов ввода, где эти обертки поставляются с интеллектуальным конструктором, так что могут быть построены только допустимые значения. Когда вы пишете генераторы для этих сделанных на заказ типов, вы можете убедиться, что нужные вам инварианты сохранены.
Вместо того, чтобы искать способ обойти систему типов (используя require
генерировать исключения во время выполнения) пусть система типов будет работать на вас. Это значительно облегчит не только написание ваших тестов на основе свойств, но и всю вашу систему.
Нет - require
это очень простой метод, как вы можете видеть из источника:
def require(requirement: Boolean) {
if (!requirement)
throw new IllegalArgumentException("requirement failed")
}
@inline final def require(requirement: Boolean, message: => Any) {
if (!requirement)
throw new IllegalArgumentException("requirement failed: "+ message)
}
Я бы предложил предоставить отдельный способ создания вашего класса, который используют только тесты. Например, если вы поместите конструктор в пакет:
package foo
final case class Foo private[foo] (...)
object Foo {
def apply(...): Foo = /* put assertions in here */
}
Затем вы можете поместить ваши генераторы скалаки в один и тот же пакет и позволить им использовать приватный конструктор.
Или, если вы действительно хотите стать странным с этим, вы можете написать свой собственный require
это определяет, следует ли пропустить проверки на основе некоторого глобального состояния или неявного параметра. Но это кажется неразумным.