2017-03-14 88 views
0

我是新來的摩卡寶石之前,我正在使用minitest來測試我的產品。然後我遇到了一個情況,我的應用程序正在向Facebook發佈工作。它選擇一些工作,然後在Facebook上發佈它們。 所以有人告訴我使用嘲笑,我發現了摩卡寶石。 我看到一個示例測試。嘲笑如何運作摩卡寶石?

def test_mocking_an_instance_method_on_a_real_object 
    job = Job.new 
    job.expects(:save).returns(true) 
    assert job.save 
    end 

但我沒有得到的想法。在我的作業控制器中,我有驗證 ,空作業無法成功保存。但在這裏嘲笑 以上測試聲稱,可以保存工作,沒有必填字段。那麼我們在上面的測試用例中究竟測試了什麼?

+0

在測試運行期間,您通常不會將數據發送到Facebook。因此你嘲笑Facebook電話。如果你的'Job'有一個'notify_facebook'方法,你可以在開始job之前調用'job.stubs(:notify_facebook)'。 – sschmeck

回答

1

這是一個很好的做法通常有以下幾個原因:

從視圖的隔離點:所述控制器的職責是處理傳入請求,並相應地觸發動作。在我們的案例中,這些行動是:創建一個新的工作,併發佈一個新的職位,如果一切正常。 (請注意我們的控制器並不需要知道如何張貼到FB)

所以,想象下面的控制器操作:

def create 
    job = Job.new job_params 

    if job.save 
    FacebookService.post_job job 
    ... 
    else 
    ... 
    end 
end 

我會測試它想:

class JobsControllerTest < ActionController::TestCase 
    test "should create a job and issue new FB post" do 
    job_params = { title: "Job title" } 

    # We expect the post_job method will be called on the FacebookService class or module, and we replace the original implementation with an 'empty/mock' method that does nothing 
    FacebookService.expects :post_job 

    post :create, job_params 

    assert_equal(Job.count, 1) # or similar 
    assert_response :created 
    end 
end 

的其他好處是:FacebookService.post_job可能需要很長時間,並且可能需要互聯網接入等,我們不希望我們的測試等待這些,特別是如果我們有CI。

最後,我會在FacebookService測試中測試真實的FB發佈,並可能會列出其他一些方法,以防止在測試運行時每次都發布FB(它需要時間,Internet,FB帳戶......) )。