0

私はrubyonrailsチュートリアルをフォローしています。そして、私はいくつかの質問があります:

1.それはそれが示されている

>> "a" * 51
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

したがって、次のコードを入力して、ユーザーの名前が51文字ではなく51文字であるかどうかを比較しようとします。

before { @user.name = "a" * 51 }

("a" * 51).lengthが51であることも示されています。

したがって、{@ user.name =( "a" * 51).length}の前に記述しないのはなぜですか。ユーザー名が51 aではなく51文字で構成されるように、より論理的です。

2.そしてまた、この瞬間は非常に奇妙に思えます。説明も奇妙です。

    describe "when email address is already taken" do
        before do
  1.        user_with_same_email = @user.dup
  2.        user_with_same_email.save
        end

        it { should_not be_valid }
      end

1.では、元のユーザー(たとえば、foo = User.new(name: "Piks"、email: "piks@piks.com")を複製し、fooのコピーを変数user_with_same_emailに配置します。 fooのコピーとそれは「true」を返すので、コピーを保存し、元のfooはデータベースにすでに存在する電子メールアドレスを持っているため、無効になります。

しかし、元のfooを無効にするには、どうすれば保存できますか?ユーザーのコピーを保存することは論理的にはまったく論理的ではなく、元のユーザーは無効になります。

「ブロック前」を誤解していると思います。「beforeblock」、つまりメソッドuser_with_same_email.saveは「false」を返す必要があります。たとえば、データベースに電子メールがいっぱいあり(ログインもあります)、データベースにすでに存在する電子メールに自分自身を登録しようとしているためです。したがって、システムは私のコピーを作成し、それをuser_with_same_emailに保存して保存しようとしますが、私の電子メールを持つ別のユーザーがデータベースにすでに存在するため、保存できません。したがって、メソッドuser_with_same_email.saveはfalseを返すため、無効なユーザーと見なされます。

この例では、「beforeblock」はroderで「true」を返してそれに進む必要があります{should_not be_valid}または私は間違っていますか?

誰かが私を助けてくれたらありがたいです。ありがとうございました

4

1 に答える 1

0

あなたはすべてを誤解していました。これはモデル コードではなく、そのためのテストです。チュートリアルでは、テスト駆動開発を強制しようとしています。アイデアは基本的に、「名前は 50 文字を超えることはできません」のように、実装が強制されるシステムに関するステートメントを指定することです。このステートメントを破ろうとするテストを作成し、それを破ることができれば、システムに欠陥があります。

次のように見てください。

before { @user.name = "a" * 51 }
it { should_not be_valid }

1 つのテストは、ユーザーの名前を 50 文字を超える文字列に設定することです。これだけ長くなることが保証されています。そして、そのままでは無効である必要があります。モデルに長さの制約を追加するのを忘れた場合、テスト システムから通知されます。

        before do
  1.        user_with_same_email = @user.dup
  2.        user_with_same_email.save
        end

        it { should_not be_valid }

これは単なる別のテストです。ダミーのユーザーを作成して複製し、両方を保存しようとします。これも失敗するはずです。失敗した場合、テストは成功し、コードが適切であることを意味します。

もう 1 つ、使用しない理由を尋ねましたbefore { @user.name = ("a" * 51).length }。これは明らかに無効です。ユーザー名を 51 文字の文字列ではなく、数字の 51 に設定しようとしているだけです。

于 2012-10-01T09:16:09.997 に答える