Rspec 如何組織測試用例?

Rails項目中,如何有效的組織測試用例? 個人的一些經驗總結在此。

1. 可讀性和可維護性是最重要的。

2. 層級和邏輯一定要清楚。

3. context 和 describe 描述一定要清晰. 基本的結構是

describe 測試什麼類 do 
   describe 測試什麼方法 do 
      context "測試的一個方面" do 
          it "它應該有什麼樣的表現" do 
          end
      end
   end
end
4. 一段比較好的測試用例代碼示例
describe UsersController do
  describe "#create" do
    subject { post :create, :group_id => group_id, :user => attributes }
 
    let(:group_id) { mock(‘group_id’) }
    let(:group)    { mock(‘group’) }
    let(:user)     { mock(‘user’) }
 
    before do
      Group.should_receive(:find).with(group_id).and_return(group)
      group.should_receive(:create_user).with(attributes).and_return(users)
    end
 
    context ‘when attributes are valid’ do
      it ‘saves the user and redirects to the index page’ do
        user.should_receive(:persisted?).and_return(true)
        subject.should redirect_to(:users)
      end
    end
 
    context ‘when attributes are not valid’ do
      it ‘saves the user and redirects to the index page’ do
        user.should_receive(:persisted?).and_return(false)
        subject.should render_template(:new)
      end
    end
  end
end

Ref From: http://blog.codeship.io/2013/12/16/yes-you-should-write-controller-tests.html?utm_source=rubyweekly&utm_medium=email

1, 使用describe 和  context 來區分 不同的測試分類和同一個測試的不同方面

describe 一般用作分類,需要測試什麼東西

context 用來對需要測試的東西的不同方面

比如

descirbe Order do #分類
   describe "#status" do 
      context "should include a default value" do  #具體的某一方面
         ... ...
     end 
   end
end

可以參考的文章 http://www.slideshare.net/ihower/rspec-7394497 @ihower的ppt,講得非常詳細,需要翻牆。

2, 區分類方法和實例方法

如 類方法用 .class_method, 實例方法使用 #instance_method 


3, 最好嵌套超過三層測試用例結構

比如 如下的測試代碼看起來就非常清楚

describe ClassA do 
    describe "#method_a" do 
        context "x = 1" do 
         end
    end
end

4, 遇到多種交錯的測試條件 改怎麼辦?

比如 我們要測試方法 method_a , 然後 方法 method_a 中有method_b 的條件約束 改怎麼辦呢?

可以使用Mock method_b方法,這樣就能減少method_a 對method_b的依賴

describe ClassA do 

   describe "#method_a" do 
      before(:each) do 
         ClassA.should_recieve(:method_b).and_return(true)
      end
   end

   describe "#method_b" do 

   end
end



5,  在使用 factory_gril initialize一個對象的時候,儘量使用build,如代碼

Factory.create(:name)

name = Factory.build(:name)
name.save(:validate_false)
name


6, 設置好 rspec的配置文件,能有利於我們查看spec的輸出

#.rspec

--colour
--format d
--drb



發佈了198 篇原創文章 · 獲贊 8 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章