2

我正在阅读 Avdi在 Rails 上的对象书,但不理解部分示例代码。

他创建了一个类,我猜是出于依赖注入的目的:

class Blog
  # ...
  attr_writer :post_source
  # ...
  private
  def post_source
    @post_source ||= Post.public_method(:new)
  end
end

然后他写了以下规范

# spec/models/blog_spec.rb
require 'ostruct'
describe Blog do
  # ...
  describe "#new_post" do
    before do
      @new_post = OpenStruct.new
      @it.post_source = ->{ @new_post }
    end
    it "returns a new post" do
      @it.new_post.must_equal @new_post
    end
    it "sets the post's blog reference to itself" do
      @it.new_post.blog.must_equal(@it)
    end
  end
end

我不明白他为什么使用@it.post_source = ->{ @new_post }

他为什么不直接使用@it.post_source = OpenStruct.public_method(:new)类似于他的博客类代码的东西@post_source ||= Post.public_method(:new)

是否有一个原因?

4

2 回答 2

2

->{ @new_post }是一个 lambda,它返回存储在 @new_post 中的实例。

Post.public_method(:new)将返回 Post 的构造方法

传入要使用的类的 lambda 可以让您控制返回的实例。传入类的构造函数意味着您不知道它将获得什么实例,只是知道它将属于您指定的类。

于 2012-06-01T12:20:44.977 回答
0

它为规范提供了参考it,否则无法在it "returns a new post"块中进行比较。它使用post_source方法中允许的简单依赖注入机制来简化可测试性。

于 2012-06-01T11:16:29.377 回答