2015-10-19 47 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