在Rspec中重用代码的最佳实践?

Jam*_*mes 4 ruby rspec ruby-on-rails capybara

我正在使用Rspec和Capybara编写集成测试.我注意到,在测试activerecord选项的创建时,我经常需要执行相同的代码.

例如:

it "should create a new instance" do
  # I create an instance here
end

it "should do something based on a new instance" do
  # I create an instance here
  # I click into the record and add a sub record, or something else
end
Run Code Online (Sandbox Code Playgroud)

问题似乎是ActiveRecord对象不会在测试中持久存在,但是Capybara默认情况下会在规范中保持相同的会话(很奇怪).

我可以模拟这些记录,但由于这是一个集成测试,其中一些记录非常复杂(它们有图像附件等等),因此使用Capybara并填写面向用户的表单要简单得多.

我已经尝试定义一个创建新记录的函数,但由于某种原因这感觉不对.这是最好的做法是什么?

Ada*_*dam 9

这里有几种不同的方式.首先,在这两种情况下,您都可以在describe或context块下对示例块进行分组,如下所示:

describe "your instance" do
  it "..." do
    # do stuff here
  end

  it "..." do
    # do other stuff here
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,在describe或context块中,您可以设置可在所有示例中使用的状态,如下所示:

describe "your instance" do
  # run before each example block under the describe block
  before(:each) do
    # I create an instance here
  end

  it "creates a new instance" do
    # do stuff here
  end

  it "do something based on a new instance" do
    # do other stuff here
  end
end
Run Code Online (Sandbox Code Playgroud)

作为before(:each)块的替代,你也可以使用let helper,我发现它更具可读性.你可以在这里看到更多相关信息.


Fab*_*bio 7

为您的要求最好的做法是用工厂女孩从该定义共同属性和蓝图创造记录database_cleaner跨越不同的测试/规格干净的数据库.

并且永远不会在不同的规范中保持状态(例如创建的记录),这将导致依赖规范.您可以使用--order randrspec选项发现这种依赖关系.如果您的规格随机失败,则会出现此类问题.