relies on the repetition of a very short development cycle: first the developer writes a failing automated test case that defines a desired improvement or new function, then produces code to pass that test and finally refactors the new code to acceptable standards
relies on the repetition of a very short development cycle: first the developer writes a failing automated test case that defines a desired improvement or new function, then produces code to pass that test and finally refactors the new code to acceptable standards TL; DR
enough code to make tests pass b. Prevents over-design c. Less code == fewer bugs 2. Inspires confidence a. Have the freedom to relentlessly refactor 3. Red -> Green verifies that the test is valid a. Testing after the fact doesn't ensure that the code you wrote made the test pass
• Factory libraries ◦ FactoryGirl, Machinist, Fabrication • TDD workflow / efficiency tools ◦ Spork ▪ Dynamic ruby server that forks before each run to ensure a clean testing state ◦ Guard ▪ Watches project files, runs corresponding tests when code or tests have changed
"can be created with no arguments" do Array.new.must_be_instance_of Array end it "can be created with a specific size" do Array.new(10).size.must_equal 10 end end
11 obj.must_be_close_to - the equivalent of assert_in_delta obj.must_be_empty - Fails unless obj.empty? obj.must_be_instance_of(klass) - Fails unless obj.class == klass obj.must_be_kind_of(klass) - Fails unless obj is of class klass or klass is one of its superclasses. obj.must_be_nil obj.must_be_same_as - tests for true object equality lambda {}.must_be_silent obj.must_be_within_delta obj.must_be_within_epsilon obj.must_equal(other) - Does a ==/eql? comparison between two objects. obj.must_include(other) obj.must_match(regex) - A regular expression match, e.g. "hello".must_match /w+/ lambda {}.must_output(stdout, [stderr..]) - The block should have certain output on stdout or stderr. Set stdout to nil just to check stderr. lambda {}.must_raise(exception) obj.must_respond_to(message) obj.must_throw(sym)
ActiveRecord::Base validates_presence_of :name validates_presence_of :date_of_birth end # ../my_project/test/factories/applicants.rb FactoryGirl.define do factory :applicant do name 'John Doe' date_of_birth { 21.years.ago } end end
have a valid factory instance" do FactoryGirl.build(:applicant).must_be :valid? end it "can successfully be saved" do applicant = FactoryGirl.create(:applicant) Applicant.first.must_equal applicant end end