Testing DAO with RSpec



我正在做一个涉及ruby、sequel和sinatra的项目。我读了一些关于使用哪种测试框架的文章,RSpec似乎是社区中使用最多的。

项目包含在一个CRUD应用程序中,使用DAO作为持久模式。

require 'sequel'
DB = Sequel.sqlite
DB.create_table :foos do
  primary_key :id
  int :foo_attribute1
  int :foo_attribute2
end
class Foo
  attr_accessor :id, :foo_attribute1, :foo_attribute2
end
module FooDAO
  extend self
  def save(f)
    DB[:foos].insert(foo_attribute1: f.foo_attribute1, foo_attribute2: f.foo_attribute2)
  end
  def [](id)
    DB[:foos].where(id: id).first
  end
  def update(f)
    DB[:foos].where(id: f.id).update(foo_attribute1: f.foo_attribute1, foo_attribute2: f.foo_attribute2)
  end
  def count
    DB[:foos].count
  end
end
describe FooDAO do
  context 'save' do
    f = Foo.new
    f.foo_attribute1 = 1
    f.foo_attribute2 = 2
    FooDAO.save f
    it { expect(FooDAO.count).to eq 1 }
  end
  context 'get' do
    it { expect(FooDAO[1][:foo_attribute1]).to eq 1 }
    it { expect(FooDAO[1][:foo_attribute2]).to eq 2 }
  end
  context 'update' do
    f = Foo.new
    f.id = 1
    f.foo_attribute1 = 2
    f.foo_attribute2 = 3
    FooDAO.update f
    it { expect(FooDAO[1][:foo_attribute1]).to eq 2 }
    it { expect(FooDAO[1][:foo_attribute2]).to eq 3 }
  end
end

在这种情况下,get上下文不会传递示例。但是如果我注释update上下文,它们会。

我还发现,如果我改变get上下文,它将传递它们所有

context 'get' do
  h = FooDAO[1]
  it { expect(h[:foo_attribute1]).to eq 1 }
  it { expect(h[:foo_attribute2]).to eq 2 }
end

这与您在上下文块中而不是在测试语句(it块)中包装其他代码的事实有关。

试试这个:

describe FooDAO do
  context 'save' do
    it "saves a Foo" do
      original_count = FooDAO.count
      f = Foo.new
      f.foo_attribute1 = 1
      f.foo_attribute2 = 2
      FooDAO.save f
      expect(FooDAO.count).to eq(original_count + 1)
    end
  end
  context 'get' do
    let!(:foo) do
      f = Foo.new
      f.foo_attribute1 = 1
      f.foo_attribute2 = 2
      FooDAO.save f
      f
    end
    it { expect(FooDAO[foo.id][:foo_attribute1]).to eq 1 }
    it { expect(FooDAO[foo.id][:foo_attribute2]).to eq 2 }
  end
  context 'update' do
    let!(:foo) do
      f = Foo.new
      f.id = 1
      f
    end
    before(:each)
      foo.foo_attribute1 = 2
      foo.foo_attribute2 = 3
      FooDAO.update foo
    end
    it { expect(FooDAO[1][:foo_attribute1]).to eq 2 }
    it { expect(FooDAO[1][:foo_attribute2]).to eq 3 }
  end
end

相关内容

  • 没有找到相关文章

最新更新