改变常量

存根

支持存根常量。与方法存根一样,存根的常量将在示例完成时恢复到其原始状态。

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")

主题