Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 单元测试所需的attr_访问器,但防止以其他方式写入字段_Ruby On Rails_Ruby_Unit Testing_Testing - Fatal编程技术网

Ruby on rails 单元测试所需的attr_访问器,但防止以其他方式写入字段

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一次一个,因为我希望这只是一个属性的问题。不

在我开始编写测试来充实某些方法应该做什么之前,我的模型在文件的顶部只有alloy/has子句。一切都很好

但是,当我开始编写测试时,我不断得到“attribute=”未定义的错误

所以我想,这很奇怪,我认为getter和setter是默认实现的。显然,它们不是用于单元测试的。因此,我添加了
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的书。