改变常量
存根
支持存根常量。与方法存根一样,存根的常量将在示例完成时恢复到其原始状态。
stub_const("Foo", fake_foo)
Foo # => fake_foo
存根的常量名称必须是完全限定的;不考虑当前模块嵌套。
module MyGem
class SomeClass; end
end
module MyGem
describe "Something" do
let(:fake_class) { Class.new }
it "accidentally stubs the wrong constant" do
# this stubs ::SomeClass (in the top-level namespace),
# not MyGem::SomeClass like you probably mean.
stub_const("SomeClass", fake_class)
end
it "stubs the right constant" do
stub_const("MyGem::SomeClass", fake_class)
end
end
end
当您存根一个模块或类的常量时,原始模块或类上的嵌套常量默认情况下不会被转移,但您可以使用 `:transfer_nested_constants` 选项告诉 rspec-mocks 转移它们。
class CardDeck
SUITS = [:Spades, :Diamonds, :Clubs, :Hearts]
NUM_CARDS = 52
end
fake_class = Class.new
stub_const("CardDeck", fake_class)
CardDeck # => fake_class
CardDeck::SUITS # => raises uninitialized constant error
CardDeck::NUM_CARDS # => raises uninitialized constant error
stub_const("CardDeck", fake_class, :transfer_nested_constants => true)
CardDeck::SUITS # => [:Spades, :Diamonds, :Clubs, :Hearts]
CardDeck::NUM_CARDS # => 52
stub_const("CardDeck", fake_class, :transfer_nested_constants => [:SUITS])
CardDeck::SUITS # => [:Spades, :Diamonds, :Clubs, :Hearts]
CardDeck::NUM_CARDS # => raises uninitialized constant error
隐藏
还支持隐藏常量。隐藏常量会临时将其删除;测试完成后会恢复到其原始值。
FOO = 42
hide_const("FOO")
FOO # => NameError: uninitialized constant FOO
与存根的常量一样,名称必须是完全限定的。
隐藏已未定义的常量没有任何效果。
hide_const("NO_OP")