Использование утверждений в производстве Ruby ... да или нет? - PullRequest
4 голосов
/ 07 апреля 2011

Итак, вот сделка. В настоящее время я работаю в среде Ruby on Rails и проработал около 1 года. До этого я был на земле C ++ / Java почти десять лет. Я (все еще) пытаюсь выяснить, что такое Ruby, когда дело доходит до утверждений.

Я не беспокоюсь о технических деталях. Я знаю, что в TestUnit есть утверждения, которые можно использовать в среде тестирования, и я знаю, что могу добавить свои собственные методы утверждения в мой проект Ruby и использовать их в рабочих Rails для блокировки известных условий. Вопрос в том, как Ruby может обеспечить / не допустить чего-либо в коде?

Для справки, я утверждал в тестах и ​​повышении в производстве. Я до сих пор не могу не пропустить мои постановки ...

Спасибо! - = Ahmed = -

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

Утверждения действительно не должны использоваться в производственном коде по двум причинам.

  1. assert x очень функциональный, и поэтому его трудно читать. Использование повышения / если комбо добавляет удобочитаемость.

  2. assert не дает понять, какая ошибка возникнет в случае сбоя условия. В то время,

    raise ObscureButInformitiveError if condition

    позволяет прикладным слоям дальше делать что-то релевантное. Например, отправка письма администратору или запись в журнал.

1 голос
/ 07 апреля 2011

Пусть произойдет ошибка, затем проверьте в журналах, что пошло не так, а затем исправьте ее.
Rails автоматически перехватывает все неперехваченные исключения, он только испортит один запрос, в котором произошла ошибка.

0 голосов
/ 02 августа 2013

В Ruby нет официальных не тестовых утверждений, но есть гемы.

Например, Джим Вейрих Учитывая выглядит многообещающе. Хотя основное внимание уделяется тестированию сред (rspec / minitest), но также:

... предоставляет три утверждения, предназначенные для использования в не тестовый / не специфицированный код. Например, вот функция квадратного корня украшенный утверждениями до и после условия.

require 'given/assertions' 
require 'given/fuzzy_number'

include Given::Assertions 
include Given::Fuzzy

def sqrt(n)   
  Precondition { n >= 0 }   
  result = Math.sqrt(n)
  Postcondition { result ** 2 == about(n) }   
  result 
end 

Чтобы использовать не проверяющие утверждения, вам необходимо 'given/assertions' файл, а затем включить модуль Given::Assertions в то, что когда-либо класс использует Precondition / Postcondition / Assert методы. Код блоком для этих утверждений всегда должен быть обычный Ruby true / false значение (методы should и ожидаемые от RSpec недоступны).

Обратите внимание, что в этом примере также используется нечеткое сопоставление чисел, но это не требуется для самих утверждений.

...