我正在尝试编写一个单元测试来检查我定义的 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/