从ruby和rspec中的mixin模块外部处理方法

时间:2018-01-16 19:03:40

标签: ruby rspec

我有一个看起来像这样的课程:

module ReusableBitlyLinks
  def shorten_url url, *args
    ShortenedUrl.shorten_url_with_bitly( url, email.user )
  end
end

我有一个看起来像这样的测试:

require File.expand_path("../../../../app/decorators/mixins/reusable_bitly_links", __FILE__)

include ReusableBitlyLinks

describe ReusableBitlyLinks do

  describe "shorten_url" do
    it "works" do
      ReusableBitlyLinks.shorten_url('asdf').should == 'asdf'
    end
  end
end

当我运行测试时,我收到一条错误消息: uninitialized constant ReusableBitlyLinks::ShortenedUrl

如何模拟存根ReusableBitlyLinks::ShortenedUrl

2 个答案:

答案 0 :(得分:0)

ShortenedUrl模块中是否定义了ReusableBitlyLinks?如果不是 - 尝试使用::ShortenedUrl.shorten_url_with_bitly访问它。

不确定什么存根与它有关...

答案 1 :(得分:0)

在mixin模块中,您需要通过预先ShortenedUrl来告诉::来自模块外部:

module ReusableBitlyLinks
  def shorten_url(url, *args)
    ::ShortenedUrl.shorten_url_with_bitly(url, email.user)
  end
end

您可能还需要在mixin文件中执行require来加载定义ShortenedUrl的任何文件。

此外,在您的测试文件中,行:

require File.expand_path("../../../../app/decorators/mixins/reusable_bitly_links", __FILE__)

可以简化为:

require_relative '../../../../app/decorators/mixins/reusable_bitly_links'