如何在Rspec中模拟Rails子类常量?

时间:2015-02-19 04:13:27

标签: ruby-on-rails rspec

我有一个BaseController,我想用其他控制器进行超类。我还使用标准ApplicationController超级控制一些控制器。

例如,我可能有:

class AController < ApplicationController
end

以及......

class BController < BaseController
end

在测试时,我有时需要创建一个任意的&#34; mock&#34;或&#34;假的&#34;要测试before_filters,模块包括等等的课程。我不经常这样做,但有时它会有所帮助。

我在我的规格中创建了一个如此:

class FakeController < ApplicationController
end

没关系。

但是现在,我需要创建这些FakeController类中的另一个,但这次是作为BaseController类的子类。

不幸的是,FakeController常量已经注册,我收到了超类错配错误。

我不想做FakeController2之类的事情 - 我认为这会打开一堆坏虫。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我没有看到使用FakeController2或任何其他名称的问题,但我能想到的唯一公共选择是引入一个模块,以便您的第二个FakeController存在于不同的命名空间,如:

module Foo
  class FakeController < ApplicationController
  end
end

remove_const上定义了一个私有方法Kernel,可用于从对象中取消注册常量。因此,如果在FakeController上定义Object,您可以通过调用取消注册:

Object.send(:remove_const, :FakeController)

此时,您可以再次定义常量,如果它从未在第一时间从未定义过。 (请记住:Ruby是一种解释性语言。)

答案 1 :(得分:0)

继承控制器的另一种方法是使用rspec-rails gem提供的anonymous controller mechanism