0

こんにちは 私はテストと TDD を学ぼうとしているので、新しいプロジェクトを開始してUserモデルを作成しました。Userでモデルを作成しました: name, gender, age.

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

TDD とは、(失敗した) テストを作成し、それらを修正してから、再度テストを実行して、それらが成功することを確認することであると読みました。それで、最初に失敗またはエラーが必要なのか、それともどちらかが機能するのかということですか?

2番目のテストを書いたばかりなので、私は尋ねています:

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ないため、失敗することを期待して を実行しましたが、エラーが発生しました。Messagehas_many :messagesUser

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/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/activemodel-3.2.8/lib/active_model/attribute_methods.rb:407:in `method_missing'
    /Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/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/ruby-1.9.3-p194@rails3tutorial2ndEd/gems/rake-10.0.2/lib" "/Users/edmundmai/.rvm/gems/ruby-1.9.3-p194@rails3tutorial2ndEd/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 のプロセスを間違って解釈しましたか?

4

2 に答える 2

3

はい、これは TDD の期待される最初のステップです。最初のテストを作成したら、次のタスクは、エラーではなく実際のエラーが発生するポイントまでコードを作成することです。失敗はエラーとは異なります。これは、テストが何かを期待していたが、その期待が満たされていないことを意味するためです。エラーが発生した場合、テスト対象のコードで何かが壊れているため、期待はテストされる機会さえ得られません。(あなたの場合、仕様は定義されていないため、等しいかどうかを確認する機会がありません。)user.sent_messages.count2sent_messages

TDD サイクルは通常、赤 (失敗) から緑 (成功 + リファクタリング) に移行することに焦点を当てます。これはプロセスの重要な部分であるためです。ただし、このサイクルには、エラー (未定義の変数/メソッドなど) から実際のエラー (未定義の変数/メソッドなど) へのプロセスが暗示されています。通常、エラーから失敗への最初のステップはかなり些細なことです (この場合、sent_messages何も指定せずに呼び出されるメソッドを定義して開始し、テストを再度実行します)。コンテキストに応じて。

于 2012-12-04T04:19:36.773 に答える
0

はい、最初はテストが失敗するはずです (そうでなければ、何もする必要はありません) 。ときどき (TDD を実行するときは 20 回のテストごとに実行します)、それらをリファクタリングします。

于 2012-12-04T04:19:19.857 に答える