【问题标题】:Passing validation tests in rails在 Rails 中通过验证测试
【发布时间】:2013-12-17 02:14:50
【问题描述】:

我正在学习 Rspec for Rails 并寻找一种方法来确保简单地创建没有提供名称的类实例不会成功。如何通过更改 Dog 类代码使下面的测试通过?

class Dog < ActiveRecord::Base
  validates_presence_of :dog_name
end

describe Dog do
  it "requires a dog name to be created" do
    dog = Dog.new(dog_name: nil)
    expect(dog.save).to be_false
  end
end

了解如何编写另一个测试来验证设置 dog_name 时记录是否成功创建也会很有帮助。

【问题讨论】:

    标签: ruby-on-rails ruby rspec tdd


    【解决方案1】:

    我强烈建议您查看shoulda-matchers gem。这将使您能够非常轻松地进行这些测试。使用shoulda-matchers,您的测试将是:

    describe Dog do
      context 'validations' do
        it { should validate_presence_of(:dog_name) }
        ...
      end
    end
    

    【讨论】:

    • 我认为奇怪的是 RSpec 的新手,这意味着添加另一个库来为他们做匹配器会跳过学习过程。
    • 完全可以,但学习过程的一部分是学习如何在有宝石的情况下不重新发明轮子。
    • 这些是控制器规格。 OP 想要测试模型。
    【解决方案2】:

    您的测试没有任何问题。如果您的系统设置正确,它应该会通过。如果您需要帮助了解当前失败的原因,则需要分享您遇到的错误。

    至于成功创建的测试,您需要提供更多信息,说明您尝试过的内容或您不理解的参考资料,以满足 SO 问题的质量要求。

    【讨论】:

    • 这不是答案,属于评论。答案几乎永远不会包含直接问题并且仍然是有效答案。
    • @Jhawins 我想说第一段可以作为答案,但我已经更新了第二段以消除这个问题。
    【解决方案3】:
    describe Dog do
      it "requires a dog name to be created" do
        dog = Dog.create(dog_name: nil)
        expect(dog).to have(1).error_on(:dog_name)
      end
    end
    

    【讨论】:

    • 你应该总是解释你的答案
    • @NARKOZ 在这种情况下也请停止回答。
    • @NARKOZ 对于 Stack 人来说,这是一种非常糟糕的方式。那回答有什么意义呢?
    • meta.stackexchange.com/questions/148272/… 这里有很多赞成和反对仅代码答案的优点。在这种情况下,我认为您应该努力为您的代码提供一些解释。将来可能对其他人有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多