测试交互请求序列

时间:2016-12-17 11:24:55

标签: ruby-on-rails rspec

最佳做法是不要使用@instance变量并使用let(:object)。但是如何编写调用序列的测试,其中每个步骤都需要先前的状态而不是干净的状态。

我想写这样的代码:

describe "intearction" do
  let(:user1) { ... }
  let(:user2) { ... }

  it "request" do
    get "/api/v1/request", {user2}, token(user1)
    expect(...).to ...
  end

  it "confirm" do
    get "/api/v1/confirm", {user1}, token(user2)
    expect(...).to ...
  end
end

但这不起作用。它可能只是这样工作:

describe "intearction" do
  let(:user1) { ... }
  let(:user2) { ... }

  it "all tests" do
    # request
    get "/api/v1/request", {user2}, token(user1)
    expect(...).to ...
    # confirm
    get "/api/v1/confirm", {user1}, token(user2)
    expect(...).to ...
  end
end

it变得无法使用,测试名称会成为注释或放入控制台。 rspec子系统失去了它的目的。使用@instance变量是不好的做法,是否有任何类似let的定义函数,每个测试不会为每组测试创建新的普通变量?

序列和api不存在第一年。你测试序列的做法是什么?

1 个答案:

答案 0 :(得分:0)

在需要为测试准备环境的测试中,您可以在before块中进行测试。所以这是你的测试看起来像

describe "intearction" do
  let(:user1) { ... }
  let(:user2) { ... }

  describe '#request' do
    it "does something" do
      get "/api/v1/request", {user2}, token(user1)
      expect(...).to ...
    end
  end

  describe '#confirm' do
    context 'request was made before' do
      before { get "/api/v1/request", {user2}, token(user1) }

      it "does something as well" do
        get "/api/v1/confirm", {user1}, token(user2)
        expect(...).to ...
      end
    end
  end
end