如何模拟 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
我有一个 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