如何模拟 Rspec 中的 Rails 子类内容?

How to mock a Rails subclass contant in Rspec?

我有一个 BaseController,我想超级class 其他控制器。我还超级class一些标准的控制器ApplicationController

例如,我可能有:

class AController < ApplicationController
end

以及...

class BController < BaseController
end

测试时,我有时需要创建一个任意的"mock"或"fake"class来测试before_filters、模块包含等。我不这样做经常,但有时会有帮助。

我在我的规格中创建了一个这样的:

class FakeController < ApplicationController
end

没关系。

但是现在,我需要创建另一个 FakeController classes,但这次是作为我的 BaseController class 的子class ].

不幸的是,FakeController 常量已经注册,我遇到了超级class 不匹配错误。

我不想做类似 FakeController2 的事情——因为我认为这会引发大量蠕虫。

有什么建议吗?

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

module Foo
  class FakeController < ApplicationController
  end
end

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

Object.send(:remove_const, :FakeController)

到那时,您可以再次定义常量,就像您从未定义过常量一样。 (记住:Ruby 是一种解释型语言。)

子类化控制器的另一种方法是使用 rspec-rails gem.

提供的 anonymous controller mechanism