ruby-on-rails - 这些方法如何添加到我的类中?

标签 ruby-on-rails ruby rspec-rails

我的 Writer 模型类没有“posted_posts”或“rejected_posts”属性。但是,使用此 SQL:

posts = self.posts.select("sum(case when state = 'posted' then 1 else 0 end) as posted_posts, sum(case when state = 'rejected' then 1 else 0 end) as rejected_posts")

我可以访问 Writer 实例上的这些“属性”。当我使用 RSpec 时,我不想进行此查询,但我无法设置 Writer 实例的这些属性,因为它认为我正在调用一个方法:

writer.rejected_posts = 8 

上面的行导致“未定义的方法'rejected_posts'”

为了“模拟”这些属性,我这样做了:

describe "performance_score" do
    it "should return a score based on the posted_posts and rejected_posts algorithm" do
      class Writer
        attr_accessor :posted_posts, :rejected_posts
      end
      writer = Factory(:writer)
      writer.rejected_posts = 8
      writer.posted_posts = 2
      writer.performance_score.should == 80
    end
  end

我的主要问题是如何将这些方法添加到类中。创建新的 Writer 类如何知道与我的 writer 工厂“同步”?我以为我正在为这个测试创建一个新的 Writer 类,但奇怪的是我仍然可以访问我的 writer 工厂的其他属性。希望这是有道理的,谢谢。

此外,是否有其他人在测试中做过类似的事情,这是处理这种情况的最佳方法吗?如果您尝试设置一个不存在的属性,那么它会直接创建它,就像在 JavaScript 中那样,那就太好了。

最佳答案

从您的选择查询返回的内容可能并不是真正的 Writer 模型。它可能是一个ActiveRecord::Relation。为了提供您在 SQL 语句中赋值的方法,它可能正在实现 method_missing 并通过 AREL 检查某种内部哈希设置。

对于测试中的模拟,您所做的肯定会起作用。另一种选择是使用stub

it "should return a score based on the posted_posts and rejected_posts algorithm" do
  writer = Factory(:writer)
  writer.stub(:rejected_posts => 8)
  writer.stub(:posted_posts => 2)
  writer.performance_score.should == 80
end

关于ruby-on-rails - 这些方法如何添加到我的类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614069/

相关文章:

ruby-on-rails - 我有一个 has_many 关系,我想设置自定义限制和偏移量。以及计算它们

ruby-on-rails - 我如何定义关联的方法?

ruby-on-rails - 将哈希数组转换为 csv 文件

Java 相当于 Ruby ObjectSpace.each_object

python - 在 Ruby 中是否有 Python 的 vars() 方法的模拟?

ruby - 无法运行 RSpec(未初始化的常量用户(NameError)

javascript - 如何使rails View 页面上的所有图像异步加载?

ruby-on-rails - 自定义路径生成器

ruby-on-rails - 带有 rspec 的 rails json.jbuilder api -> ActionView::MissingTemplate

ruby-on-rails - 应该::匹配器::独立::DelegateMethodMatcher:未定义的方法 `allow_nil'