小编Chr*_*ent的帖子

带RSpec的DRY控制器规格

我目前正在努力保持我的控制器规格DRY和简洁,并在每个示例下降为一个断言.我遇到了一些困难,特别是在嵌套的结构中将实际的控制器请求调用放在哪里以匹配各种边缘情况.

这是一个示例,简化为演示问题:

describe MyController do
  let(:item) { Factory(:item) }
  subject { response }

  describe "GET #show" do
    before(:each) do
      get :show
    end

    context "published item" do
      it { should redirect_to(success_url) }
    end

    context "unpublished item" do
      before(:each) do
        item.update_attribute(published: false)
      end

      it { should redirect_to(error_url) }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

显然这是一个人为的例子,但它说明了我想做什么和什么不行.主要是,before"未发布"上下文中的块是问题所在.由于上下文嵌套的方式,我在调用实际发生的设置数据的变化会发生什么变化get,因此该上下文中的示例实际上是使用初始场景而不是我想要的场景.

我理解为什么会发生这种情况以及上下文如何嵌套.我想我会喜欢有一些方法来告诉RSpec的想什么,我就向右运行后,任何before尚未右勾拳之前给定的范围内的任何断言.这对控制器规格来说是完美的.我想利用我的控制器规范中的嵌套来逐渐构建边缘情况的变体,而不必将get调用分散,甚至do_get在我的每个it断言中调用助手.这与it_should我正在使用的任何自定义宏保持同步尤其令人讨厌.

目前RSpec还有什么可以实现这一目标吗?有什么技巧可以用来接近吗?它看起来非常适合我看到很多人编写控制器规格的方式; 根据我的发现,人们基本上已经决定do_get在每次断言之前都要求帮助者.有没有更好的办法?

rspec ruby-on-rails dry functional-testing

6
推荐指数
1
解决办法
3173
查看次数

使用ActiveRecord确保方法内的事务

我有一种情况,我想在事务中使用一种方法,但只有在事务尚未启动的情况下.这是一个用来提炼我所说的内容的人为例子:

class ConductBusinessLogic
  def initialize(params)
    @params = params
  end

  def process!
    ActiveRecord::Base.transaction do
      ModelA.create_multiple(params[:model_a])
      ModelB.create_multiple(params[:model_a])
    end
  end
end

class ModelA < ActiveRecord::Base
  def self.create_multiple(params)
    # I'd like the below to be more like "ensure_transaction"
    ActiveRecord::Base.transaction do
      params.each { |p| create(p) }
    end
  end
end

class ModelB < ActiveRecord::Base
  def self.create_multiple(params)
    # Again, a transaction here is only necessary if one has not already been started
    ActiveRecord::Base.transaction do
      params.each { |p| create(p) }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

基本上,我不希望这些作为嵌套事务.我希望这些.create_multiple方法只在事务中没有调用它们时启动事务,例如通过ConductBusinessLogic#process!.如果模型方法本身被调用,它们应该开始自己的事务,但如果它们已经在事务中被调用 …

transactions ruby-on-rails rails-activerecord

5
推荐指数
1
解决办法
832
查看次数