问题
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