ruby - 如何避免编写同义反复测试

标签 ruby testing

我正在尝试编写一个单元测试来检查我定义的 Ruby 模型是否具有属性 name。使用 rspec,我有:

class MusicianTest < ActiveSupport::TestCase

  describe Musician do
    let(:musician) { Musician.new }

    describe "attributes" do
      it "has a name" do
        musician.name = "Axel"
        expect(musician.name).to eq("Axel")
      end
    end

  end
end

这是同义反复吗?我可以使用更好的方法吗?

最佳答案

我认为有几种方法可以更好地测试它。如果您的模型是 ActiveRecord 那么您可以检查 column_names 属性

musician.column_names.should include 'name'

如果它是一个普通的 ruby​​ 对象,那么您可以检查它是否响应 setter 和 getter

musician.should respond_to(:name)
musician.should respond_to(:name=)

通常,规则是您的测试应该说明您实际测试的内容。例如,您的测试看起来像是在测试 setter 和 getter,如果您在 setter/getter 中做了一些魔法并希望确保事情正常工作,那么这是完全正常且合法的。

因此,就您的情况而言,如果您尝试验证某个属性是否存在,您应该只说 attributes.include 'name' 或类似的内容。

脚注。如果您正在进行一些普通的 ActiveRecord 测试,就我个人而言,我不会测试属性的存在,我会定义一个 FactoryGirl 工厂,其中包含应该存在的属性,如果由于某种原因它们丢失了每当您使用 FactoryGirl 生成新对象时,您的测试都会崩溃。

关于ruby - 如何避免编写同义反复测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20256851/

相关文章:

unit-testing - 读取配置文件的单元测试函数

c# - NUnit 用于类库的集成测试

ruby - 在 Ruby 中删除数组中的 nil 和空白字符串

ruby - 如何自动化 Homebrew 程序安装?

ruby-on-rails - heroku 运行 rake db :migrate reverts migrations

testing - Laravel 断言完整列表

html - Selenium 断言有类

java - 如何在 MockMvc 中指定@RequestMapping 参数

ruby - 每个功能前后是否有 cucumber 钩子(Hook)运行

ruby-on-rails - 嵌套路由的 url 中的用户名