Testing interaction requests sequences

亡梦爱人 提交于 2019-12-25 07:49:27

问题


There best practices is do not use @instance variables and use let(:object). But how to write test of call sequences where each step require previous state but not clean state.

I'd like to write code like this:

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

But that will not work. It may be worked only like this:

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

The it become unusable and names of tests become comments or puts to console. The rspec subsystem loses its purpose. Using @instance variables is bad practice, is there any let-like definition function that does not create new plain variable per each test but per group of tests?

The sequences and api's exists not the first year. What is about your practice of testing sequences?


回答1:


In tests when you need to prepare environment for the test you do it in before block. So here is how your tests might look like

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


来源:https://stackoverflow.com/questions/41198066/testing-interaction-requests-sequences

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!