Я раньше использовал NUnit, но я переключился на MbUnit, так как это имеет больше функций. Я люблю RowTest. Это позволяет Вам параметризовать свои тесты. NUnit действительно имеет разрядную лучшую поддержку инструмента мусора все же. Я использую ReSharper для запущения Тестов MbUnit. У меня были проблемы с TestDriven.NET, выполняющим мои методы SetUp для MbUnit.
Как правило, вы хотите использовать в своих контроллерах версии без поддержки Bang. Это допускает такую логику:
def update
@model = Model.find params[:id]
if @model.update_attributes params[:model] #returns true of false
# handle success
else
# handle failure
end
end
Я часто использую версии Bang в тестах, когда хочу убедиться, что я знаю, что что-то не проверяется и не сохраняется. Я определенно потратил время на отладку тестов, которые терпели неудачу из-за измененных проверок модели, что было бы очевидно, если бы я использовал версии Bang.
например
it "should do something" do
m = Model.create! :foo => 'bar' # will raise an error on validation failure
m.should do_something
end
С точки зрения отсутствия недопустимых данных в базе данных, вы должны обрабатывать это с помощью проверок ActiveRecord (например, validates_presence_of: user_id
) или определения вашего собственного метода validate
в модели. ( http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html ) Это должно предотвратить сохранение, если ваши данные недействительны. Если вы действительно параноик, вы можете добавить некоторые ограничения в свою базу данных. Ознакомьтесь с документацией ActiveRecord :: Migration
, чтобы узнать, как настроить уникальные индексы и другие ограничения базы данных в ваших миграциях.
Также, по моему опыту, вы хотите, когда это возможно, избегать использования каких-либо настраиваемых методов сохранения или создания. Если вы повторно реализуете функциональность, включенную в ActiveRecord, вы в конечном итоге заплатите цену в будущем. http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist может больше сказать по этому поводу.
Также, по моему опыту, вы хотите, по возможности, избегать использования каких-либо специальных методов сохранения или создания. Если вы повторно реализуете функции, включенные в ActiveRecord, вы в конечном итоге заплатите цену в будущем. http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist может сказать больше по этому поводу.
Также, по моему опыту, вам следует избегать использования каких-либо настраиваемых методов сохранения или создания, когда это возможно. Если вы повторно реализуете функциональность, включенную в ActiveRecord, вы в конечном итоге заплатите цену в будущем. http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist может сказать больше по этому поводу.
Основное отличие заключается в том, как обрабатываются неудачные сохранения. При обновлении класса ActiveRecord версия !
вызовет исключение, если запись недействительна.
Я рекомендую прочитать документацию здесь - http://api.rubyonrails.org/classes/ActiveRecord /Base.html
Использование транзакций также может быть тем, на что стоит обратить внимание - http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html