2012-12-04 18 views
0

嗨我试图学习测试和TDD,所以我开始了一个新的项目,并作出User模型。我制作了User型号:name, gender, ageRails:单元测试时,在开始时需要“失败”还是“错误”?

class User < ActiveRecord::Base 
    attr_accessible :age, :gender, :name 
end 

,我读了TDD的目的是使测试(失败的),固定它们,然后再次运行测试,看看他们通过。那么这是否意味着我希望先发生故障或发生故障或者做任何工作?

我这么问是因为我只是写了第二个测试:

require 'test_helper' 

class UserTest < ActiveSupport::TestCase 
    test "user is created" do 
    user = User.create(:name => "Edmund", :age => 3, :gender => "m") 
    assert_equal user, User.find_by_name("Edmund") 
    assert_equal 3, User.count 
    end 

    test "user has sent messages" do 
    user = User.create(:name => "Edmund", :age => 3, :gender => "m") 
    2.times do 
     user.sent_messages.create(:sender_id => user.id) 
    end 
    assert_equal 2, user.sent_messages.count 
    end 


end 

所发送消息。我跑rake test:units,期待它是失败的,因为我没有任何Message模型也不符合has_many :messages任何关联,我User模型,但我得到了一个错误:

Edmunds-MacBook-Pro:langoexchange edmundmai$ rake test:units 
NOTICE: CREATE TABLE will create implicit sequence "users_id_seq" for serial column "users.id" 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "users_pkey" for table "users" 
Run options: 

# Running tests: 

E. 

Finished tests in 0.087926s, 22.7464 tests/s, 22.7464 assertions/s. 

    1) Error: 
test_user_has_sent_messages(UserTest): 
NoMethodError: undefined method `sent_messages' for #<User:0x007fa73bbd68e0> 
    /Users/edmundmai/.rvm/gems/[email protected]/gems/activemodel-3.2.8/lib/active_model/attribute_methods.rb:407:in `method_missing' 
    /Users/edmundmai/.rvm/gems/[email protected]/gems/activerecord-3.2.8/lib/active_record/attribute_methods.rb:149:in `method_missing' 
    /Users/edmundmai/Desktop/Class/Ruby/langoexchange/test/unit/user_test.rb:13:in `block (2 levels) in <class:UserTest>' 
    /Users/edmundmai/Desktop/Class/Ruby/langoexchange/test/unit/user_test.rb:12:in `times' 
    /Users/edmundmai/Desktop/Class/Ruby/langoexchange/test/unit/user_test.rb:12:in `block in <class:UserTest>' 

2 tests, 2 assertions, 0 failures, 1 errors, 0 skips 
rake aborted! 
Command failed with status (1): [ruby -I"lib:test" -I"/Users/edmundmai/.rvm/gems/[email protected]/gems/rake-10.0.2/lib" "/Users/edmundmai/.rvm/gems/[email protected]/gems/rake-10.0.2/lib/rake/rake_test_loader.rb" "test/unit/**/*_test.rb" ] 
Tasks: TOP => test:units 
(See full trace by running task with --trace) 

这(错误)的预期结果的TDD,还是我做错了什么?或者错误地解释了TDD的过程?

回答

3

是的,这是TDD预期的第一步。一旦你编写了你的​​第一个测试,你的下一个任务就是让你的代码达到你得到实际的失败而不是的错误。失败与错误不同,因为这意味着你的测试期待着某些东西,并且期望没有得到满足。在发生错误的情况下,期望甚至没有机会被测试,因为测试代码中的某些内容会中断。 (在你的情况,该规范从来没有得到一个机会来检查user.sent_messages.count是否等于2因为sent_messages甚至没有定义。)

的TDD周期通常侧重于从红色(失败)获得绿色(成功+重构)因为这是过程的重要部分,但隐含在这个循环中的过程是从错误(未定义变量/方法等)到实际失败(未达到期望等)的过程。通常,从错误到失败的第一步是(在这种情况下,定义一个名为sent_messages的方法,其中没有任何内容可以启动,然后再次运行测试),但它可能不取决于上下文。

0

是的,您的测试最初应该失败(否则,没有工作要做),那么您至少要做以使其通过。每隔一段时间(我在进行TDD时每20次测试一次),就会重构它们。