2016-12-17 51 views
0

最佳做法是不要使用@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不是第一年。你測試序列的做法是什麼?

回答

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