0

我正在编写一个测试,其中有一个需要在setup do.

typed: strict
frozen_string_literal: true

class BunnyTest
  extend(T::Sig)

  setup do
    @bunny = T.let(Bunny.new, Bunny)
  end

  test "#hop works correctly" do
    assert(@bunny.hop)
  end
end

当我运行类型检查时,我收到一条消息:

The instance variable @bunny must be declared inside initialize or declared nilable

有没有办法像处理中的 ivar 声明setup do一样处理 ivar 声明#initialize

4

1 回答 1

0

有几种选择

重写器

如果你使用, SorbetMinitest中有一个重写器可以为你工作。

您可以为您选择的测试框架编写一个

__initialize+ 方法

这会变得很冗长,特别是如果您有多个想要执行此操作的值

class BunnyTest
  extend(T::Sig)

  def __initialize__
    @bunny = T.let(nil, Bunny)
  end

  setup do
    @bunny = Bunny.new
  end

  def bunny
    T.must(@bunny)
  end

  test "#hop works correctly" do
    assert(bunny.hop)
  end
end

避免setup

这不是在回答您的问题,而是一种使其变得不必要的替代方法。我知道有些情况setup会有所帮助,但根据经验,我会避免它,并在我的测试用例中使用显式初始化。这使得只需查看案例就可以更轻松地了解正在发生的事情,并避免其他案例影响其他案例所需的副作用/更改:

class BunnyTest
  extend(T::Sig)

  sig {returns(Bunny)}
  def bunny
    Bunny.new
  end

  test "#hop works correctly" do
    assert(bunny.hop)
  end

  test "can #hop twice" do
    my_bunny = bunny
    assert(bunny.hop)
    assert(bunny.hop, "Should be able to hop a second time")
  end
end
于 2021-11-19T19:42:09.047 回答