[DAY16] Data Access Layer 测试

准备工作

在开始介绍如何测试 repository 之前,要先带过有使用的一些套件
本系列文章以 Rspec 作为测试用的框架,并且有使用 FactoryBot 来建立测资。

关於 Rspec 可以阅读下列文章

关於 FactoryBot 可以阅读下列文章

测试概念

  1. 透过 FactoryBot 建立测试资料的 aggregate
  2. 利用 Repository 中的 save 来存进 DB 中
  3. 利用 Repository 中的 find_by_identity 来拿 aggregate
  4. 预期从 Repository 拿出来的 aggregate 与 FactoryBot 建立的 aggregate 要一样
  5. 利用 Repository 中的 destroy 删除 aggregate
  6. 预期 DB 中没有此笔 record

如此专案中的 repository 测试可以通用化成

# repository_spec.rb
RSpec.shared_examples 'a repository' do
  describe '.save' do
    it 'create record by entity' do
      repo.save(entity)
      actual_entity = repo.find_by_identity(identity)
      expect(actual_entity.to_h).to include(entity.to_h)
    end
  end

  describe '.destroy' do
    it 'destroy record by identity' do
      repo.save(entity)
      repo.destroy(entity)
      actual_entity = repo.find_by_identity(identity)
      expect(actual_entity).to be_nil
    end
  end
end

而 domain 内的 repository 测试则写成

# user_repository_spec.rb
require 'rails_helper'

RSpec.describe Repositories::Order do
  it_behaves_like 'a repository' do
    let(:entity) { build_entity }
    let(:identity) { build_identity }
    let(:repo) { described_class.new }
  end

  private

  def build_entity
    create(
      :entity_order,
      serial_number: 'ABC-1234567890',
			status: :refunded,
			puchased_at: Time.zone.now,
			comment: '测试',
    )
  end

  def build_identity
    {
      serial_number: 'ABC-1234567890',
    }
  end
end

# factory/order.rb
FactoryBot.define do
  factory :entity_order, class: 'Entities::Order' do
    serial_number { nil }
    statu s{ nil }
    puchased_at { nil }
    comment { nil }

    skip_create
    initialize_with { new(attributes) }
  end

这样一来,只需要定义好 entity 测资,便可以快速地建立测试,降低建立基础建设的时间。

下一篇将分享团队讨论过关於 DAL 的问题,以及目前的结论。


<<:  [Day 16] Data! — 资料就是我的超能力

>>:  MyBatis 前导

Day30 D3js 浪漫突进的回顾及展望

D3js 浪漫突进的回顾及展望 你只要顾好你会的、你喜欢的,一直讲、拼命讲,展现你的魅力! -- 浪...

Day2-台湾菜鸟工程师再度挑战之序之一

现场决定之後那天刚好是10/12 然後正式工作的时间是10/22 在那边之前我需要到其他公司进行教育...

[Day-25] R语言 - 分群应用(五) 分群预测 - 资料清洗 ( data cleaning in R.Studio )

您的订阅是我制作影片的动力 订阅点这里~ 影片程序码(延续昨天) #步骤一: na补值&相异...

[Day 1] 身为一名普通 iOS 开发者所需的程序以外的知识 Intro

前言 Hi 我是一名普通的 iOS 开发者,兴趣使然的 UI 设计师。不小心参与了几年 iOS 开发...

Day13,先让我设定一下terminal(插曲)

正文 前几天开始在弄Kubernetes相关LAB的时候不是很顺手,因为这台笔电平常很少使用,所以常...