0

我正在关注 ruby​​ on rails 教程。我有几个问题:

1. Hier表明

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

因此,我们尝试通过键入以下代码来比较我们的用户的名称是否为 51 个“a”而不是 51 个字符:

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

还表明 ("a" * 51).length 为 51。

那么为什么我们不写在 { @user.name = ("a" * 51).length } 之前更符合逻辑,这样用户名由 51 个字符组成,而不是 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 中。在 2. 我们保存foo 的副本,它返回“true”,因此我们保存了副本,原始 foo 具有数据库中已经存在的电子邮件地址,因此应该是无效的。

但是我要保存的原始 foo 怎么可能无效呢?保存用户的副本根本不符合逻辑,因此原始用户无效。

我想我误解了“前块”。“前块”,即方法 user_with_same_email.save 应该返回“false”。为什么?因为例如,我们的数据库中充满了电子邮件(也有登录名),然后我尝试使用数据库中已经存在的电子邮件注册自己。因此,系统复制了我并将其保存在 user_with_same_email 中并尝试保存它,但它不能,因为数据库中已经存在另一个用户与我的电子邮件。因此,方法 user_with_same_email.save 将返回 false,因此我被认为是无效用户。

在这个例子中,“前块”应该在 roder 中返回“true”以继续它 { should_not be_valid } 还是我错了?

如果有人帮助我,我将不胜感激。谢谢

4

1 回答 1

0

你误解了整个事情。它不是模型代码,它是对它的测试。本教程试图强制测试驱动开发。这个想法基本上是指定有关您的系统的强制执行的语句,例如“名称不能超过 50 个字符”。你为它创建了一个测试,你试图打破这个语句,如果你能打破它,那么系统就有问题。

看起来像这样:

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

一项测试是将用户名设置为长度超过 50 个字符的字符串。这保证是那么长。它应该是无效的,因为它是。如果您忘记在模型中添加长度约束,测试系统会通知您。

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

        it { should_not be_valid }

这只是另一个测试。它创建一个虚拟用户,复制它,并尝试保存两者。这也应该失败。如果失败,则测试成功,这意味着您的代码是好的。

还有一件事,你问为什么不直接使用before { @user.name = ("a" * 51).length }. 这显然是无效的,您只需尝试将用户名设置为 51,一个数字,而不是 51 个字符长的字符串。

于 2012-10-01T09:16:09.997 回答