Ruby on rails 单元测试所需的attr_访问器,但防止以其他方式写入字段
在我开始编写测试来充实某些方法应该做什么之前,我的模型在文件的顶部只有alloy/has子句。一切都很好 但是,当我开始编写测试时,我不断得到“attribute=”未定义的错误 所以我想,这很奇怪,我认为getter和setter是默认实现的。显然,它们不是用于单元测试的。因此,我添加了Ruby on rails 单元测试所需的attr_访问器,但防止以其他方式写入字段,ruby-on-rails,ruby,unit-testing,testing,Ruby On Rails,Ruby,Unit Testing,Testing,在我开始编写测试来充实某些方法应该做什么之前,我的模型在文件的顶部只有alloy/has子句。一切都很好 但是,当我开始编写测试时,我不断得到“attribute=”未定义的错误 所以我想,这很奇怪,我认为getter和setter是默认实现的。显然,它们不是用于单元测试的。因此,我添加了attr\u accessor:selected\u end\u index、:selected\u start\u index、:revision\u number一次一个,因为我希望这只是一个属性的问题。不
attr\u accessor:selected\u end\u index、:selected\u start\u index、:revision\u number
一次一个,因为我希望这只是一个属性的问题。不,是和他们一起的
我通过了所有的测试,然后我又重新开始编码,突然间,我无法再写这些属性了
我通过Change.new(:revision_number=>3等)创建模型,但是这些字段在数据库中都是空的
当我从我的模型中删除attr\u访问器:selected\u end\u index、:selected\u start\u index、:revision\u number
行时,一切又开始工作了(当然,除了测试之外)
这是怎么回事?我如何使这些属性能够在我的单元测试和开发环境中访问
我正在使用Ruby 1.8.7和Rails 2.3.8。还使用默认的单元测试框架(以及Factory Girl) 更新:添加代码 这在没有attr_访问器的情况下有效,但在我有attr_访问器的情况下无效:
change = Change.new(:kind => Change::CHANGE,
:status => Change::NEW,
:revision_number => latest_revision,
:content_id => params[:content_id],
:selected_text => selected_text,
:selected_start_index => selection_index_within_content_body,
:selected_end_index => selection_end_index_within_content_body,
:selection_hash => hash,
:suggested_text => params[:suggested_text],
:name_of_user => cookies[:login_name])
当上述内容保存到数据库中时,如果我没有attr\u访问器,则所选的开始/结束索引和修订将毫无问题地保存
@a = Factory(:change, :content_id => content[:id],
:selected_start_index => 10,
:selected_end_index => 12)
如果没有attr_访问器,上述(来自我的单元测试)将无法工作。它说selected_start_index=是一个未定义的方法。但是当我添加attr_访问器行时。测试将继续并最终成功。您可以在测试中扩展要测试的类 例如:
class A
def initialize(value)
@a = value
end
def double
@a = @a * 2
end
end
当您想要测试内部值时,您需要读卡器。您可以在测试内部扩展测试:
require 'test/unit'
class A
attr_reader :a
end
class Test_A < Test::Unit::TestCase
def test_1
a = A.new(1)
assert_equal( 1, a.a )
a.double
assert_equal( 2, a.a )
end
end
要求“测试/单元”
甲级
属性读取器:一个
结束
类测试A
您能否展示一个您拥有的类的示例,以及使用该类的代码?ActiveRecord仅为DB字段实现getter和setter。您可能没有创建/迁移数据库吗?另外,Test::Unit是不必要的痛苦。我建议改为RSpec。稍后我将添加一些代码。是的,正如我所说的,所有东西都被迁移了:当我没有attr_访问器行时,控制器/模型代码可以工作。在测试中没有。但是你迁移了你的测试数据库吗?ActiveRecord依赖于反映数据库中内容的能力。或者(我听说过)RSpec的书。