2015-10-19 46 views
0

我是新來的RSpec的,我敢肯定有一個更簡單的方法做我想做的模型:導軌 - 測試使用從複製

我想測試我的車型之一 - 「UserStatuses。 RB」。 每個測試都在一個事務中運行。 所以我定義:

config.use_transactional_fixtures = true 

我寫的每個測試之前運行的東西:

describe "UsersStatuses" , type: :model, :focus => true do 
    before(:each) do 
     UsersStatuses.delete_all 
     user_status = UserStatus.new() 
     user_status.save 
    end 

我寫的測試後,右側的 '前'(裏面的描述):

it "Get items" 
     res = UserStatuses.func() 
     expect(res.length).to eq(1) 
    end 
... 
end 

UserStatuses中的func方法是:

def func 
    return using(:slave).connection.select_rows("SELECT id FROM user_statuses") 
end 

當我運行測試時,它失敗。 從我看到的 - 從func返回的行,與之前在'before'部分中刪除它們之前的數據相同。 但是當我在use_transactional_fixtures = false的時候運行測試,它會起作用('before'中的數據被保存並且以func的形式返回)。

我的猜測是,在事務模式 - user_status.save發生在'before'之前,它提交給DB,也提交給slave。因此,'之前'中所做的任何更改都適用於從屬設備,並且func會返回所需的內容。 但我不確定。

有什麼辦法可以將更改應用於從屬?

+0

不知道是否在您的文章或代碼一個錯字,但你'except',而不是'expect' –

+0

@PaulFrench錯字在我的代碼,謝謝! 但我仍然有問題。 B.T.W, 使用(:奴隸)是從章魚寶石。 – McMendel

回答

0

從我看到的--RSpec與Shared(八達通寶石)不兼容。

我重寫了Octopus :: Model :: SharedMethods下的'using'方法。因此,如果在我的代碼中的任何一點使用(:slave),它會調用我的'使用' ,並且將使用:slave分片。所有「變更」都​​將在主數據庫中完成,並在測試結束時回滾。

新功能:

module Octopus 
    module Model 
     module SharedMethods 
      def using(shard) 
       return self 
      end 
     end 
    end 
end