3

这是我在 RSpec 中使用的一种很好的技术,我也想在使用 Shoulda 和 Shoulda-context 的项目中使用它。但我不知道这是否可能。有没有办法做到这一点?

我想要的是:在外部上下文中定义一个setup( ) 块,该块引用嵌套上下文中的子句。这样,内部上下文可以配置在外部引用的值,并且仍然可以在内部上下文中是 DRY。beforeletsetupsetup

RSpec 示例(此示例很简单——请假设我的真实示例在before块中有更多我不想复制的代码):

describe Thing do
  before do
    # Notice that `user` isn't defined here--it's defined in `let` blocks
    # in nested contexts below.
    login_as user

    # Assume there's lots more code here that I would like to keep
    # DRY across contexts.
  end

  context "when logged in as an admin" do
    # THIS IS THE MAGIC RIGHT HERE:
    let(:user) { Factory(:user, role: "admin") }

    it "should ..." ...
  end

  context "when logged in as a normal user" do
    # THIS IS THE MAGIC RIGHT HERE:
    let(:user) { Factory(:user) }

    it "should ..." ...
  end
end

总结一下:我如何使用 shoulda-context 和 Test::Unit 来做到这一点?

我已经尝试过的一些事情没有奏效:

  • def在每个子上下文中重新定义一个方法。
  • before_should在每个子上下文中。
4

1 回答 1

3

我发现测试类中的辅助方法对于提取在测试之间重复的代码很有用。像这样:

class MyTest < TestCase
  context "when logged in as an admin" do
    setup do
      do_login Factory(:user, role: "admin")
    end

    should "..." do
      ...@user...
    end
  end

  context "when logged in as an admin" do
    setup do
      do_login Factory(:user)
    end

    should "..." do
      ...@user...
    end
  end

  def do_login(user)
    login_as user
    @user = user

    # lots more setup code here...
  end
end
于 2013-08-14T17:13:35.173 回答