0

我认为这既是一个编程实践问题,也是一个技术问题。

我正在学习 Ruby on Rails 教程,并且正在学习第 7 章练习,问题 2。这个问题要求您编写测试来验证无​​效用户的错误消息是否出现在重新加载的注册页面上(例如,空白密码、无效电子邮件地址)。

我有一些运行良好的代码,但我觉得我实际上并没有测试任何东西。我只是测试了当我手动将空白用户输入到注册页面时出现的错误消息的存在。不出所料,测试通过了——我只是将错误消息复制并粘贴到测试中!

我的相关部分user_pages_spec.rb是:

describe "signup" do

before { visit signup_path }

let(:submit) { "Create my account" }

describe "with invalid information" do
  it "should not create a user" do
    expect { click_button submit }.not_to change(User, :count)
  end
  describe "after submission" do
    before { click_button submit }
    it { should have_selector('title',text: 'Sign up') }
    it { should have_content('error') } 
    it { should have_content('Password digest can\'t be blank') }
    it { should have_content('Name can\'t be blank') }
    it { should have_content('Email can\'t be blank') }
    it { should have_content('Email is invalid') }
    it { should have_content('Password can\'t be blank') }
    it { should have_content('Password is too short (minimum is 6 characters)') }
    it { should have_content('Password confirmation can\'t be blank') }
  end
end

这是正确的方法吗?我不应该让 Ruby 告诉我错误消息/翻译是什么,并测试它们吗?如果我更改其中一个验证条件(例如密码长度)会发生什么情况? 同样,当我修复有关密码摘要的错误消息时,我是否必须更改我的测试文件?

编辑:如果我不知道确切的错误字符串是什么?Ruby 不应该告诉测试错误消息是什么吗?我应该为此使用'have(x).errors_on'吗?.

4

1 回答 1

1

您总是可以将测试扩展到您将测试用户是否要插入用户名而不是密码、检查结果等的地方。不过我认为这将是矫枉过正。除此之外,我认为你很好。

如果要更改错误消息,则必须更改测试。但是让我们想想 TDD 是如何工作的。您编写测试,然后编写代码,然后在需要时进行重构。因此,理想情况下,您已经知道您的验证条件是什么。如果您想稍后更改代码,那么您将更改您的测试,然后是您的代码。

来自 Ruby on Rails 测试指南:

Ideally, you would like to include a test for everything which could possibly break. It’s 
a good practice to have at least one test for each of your validations and at least one 
test for every method in your model.

我们不仅可以将其扩展到模型,还可以扩展到您的控制器、路由等。换句话说,测试您的代码在做什么。例如,如果您将其设置为用户在登录时看到的 Flash 消息,则进行测试以确保用户看到的是该 Flash 消息。如果用户做错了什么并且应该看到不同的 flash 消息,那么测试以确保他们得到不同的 flash 消息。

在您完成 Hartl 的教程后,我会考虑查看应该匹配器。

这是关于 rspec 最佳实践的简短自述文件。

最后,Wolfram Arnold 的六部分教程系列有助于了解要测试的内容,尽管它有点过时了。

编辑:您必须在测试中写入 Rails 预先编写的错误消息,除非您当然编写了自定义消息。幸运的是,您可以在Ruby 国际化或简称 Ruby l18n 中找到预先编写的错误。以下是预期消息的列表:

  inclusion: "is not included in the list"
  exclusion: "is reserved"
  invalid: "is invalid"
  confirmation: "doesn't match confirmation"
  accepted: "must be accepted"
  empty: "can't be empty"
  blank: "can't be blank"
  too_long: "is too long (maximum is %{count} characters)"
  too_short: "is too short (minimum is %{count} characters)"
  wrong_length: "is the wrong length (should be %{count} characters)"
  not_a_number: "is not a number"
  not_an_integer: "must be an integer"
  greater_than: "must be greater than %{count}"
  greater_than_or_equal_to: "must be greater than or equal to %{count}"
  equal_to: "must be equal to %{count}"
  less_than: "must be less than %{count}"
  less_than_or_equal_to: "must be less than or equal to %{count}"
  odd: "must be odd"
  even: "must be even"

将您要验证的属性插入到上述错误消息的开头,然后将其插入到您的测试中,瞧,这就是您应该从 Rails 获得的错误消息。

最后,have(x).errors_on这是一种测试 Flash 消息的方法。Shoulda matchers 也有一个专门用于 Flash 消息测试的相关页面。我认为任何额外的东西都将是矫枉过正。

于 2012-12-13T08:08:53.863 回答