ruby - 我如何测试(TDD)单例类?

标签 ruby tdd minitest

我开始使用 Minitest 在 Ruby 应用程序中使用 DDD 和 TDD。 我创建了一个存储库类(没有数据库访问权限,但它为我生成了实体)。是单例。

我想测试实体的生成。问题是因为它是单例,所以测试的执行顺序会影响结果。

有什么方法可以强制处置单例元素使其“新鲜”吗?

这是我的存储库代码:

require "singleton"

class ParticipantRepository
    include Singleton

    def initialize()
        @name_count = 0
    end

    def generate_participant()
        participant = Participant.new
        participant.name = "Employee#{get_name_count()}"
        return participant
    end

    private 
    def get_name_count()
        old_name_count = @name_count
        @name_count += 1
        return old_name_count
    end
end

和测试:

require_relative 'test_helper'


class ParticipantRepositoryTest < MiniTest::Unit::TestCase

    def setup()
        @repository = ParticipantRepository.instance
    end

    def test_retrieve_participant
       participant = @repository.generate_participant

       refute_nil participant
       refute_nil participant.name
       refute_equal("", participant.name)
       assert_equal(0, participant.subordinates_count)
    end

    def test_employee_name_increment
        participant1 = @repository.generate_participant
        participant2 = @repository.generate_participant

        refute_equal(participant1.name, participant2.name)

        index_participant1 = /Employee([0-9]+)/.match(participant1.name)[1]
        index_participant2 = /Employee([0-9]+)/.match(participant2.name)[1]

        assert_equal(0, index_participant1.to_i)
        assert_equal(1, index_participant2.to_i)
    end

end

断言 assert_equal(0, index_participant1.to_i) 在 test_employee_name_increment 先执行时成功,在最后执行时失败。

我希望能够测试存储库(因为它会演变成更大的东西)。我该怎么做?

谢谢!

最佳答案

订购您的测试并不重要。要正确测试单例类,您需要将其视为实例对象。为此,请在设置期间将您的单例包装在匿名类中。每次调用安装程序时,您都会获得 ParticipantRepository 的未修改副本:

def setup
  @repository = Class.new(ParticipantRepository).instance
end

关于ruby - 我如何测试(TDD)单例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26171007/

相关文章:

测试 BPEL 流程?

ruby - 在内存中预加载 minitest 以提高速度

ruby-on-rails - Rails/Ruby 将图像保存为 base64 并在 View 中访问它

ruby - 如何使用 ruby​​ 使用 rack 在带有 gem carrierwave 的 cloudinary 上存储图像

ruby - Ruby 中的空体方法有什么用?

javascript - Karma 运行程序在 TDD 上因解析错误而退出

ruby - 计算大型字符串数据集最快的设置是什么?

mysql - 如何在 Rails 中预先填充的数据库上运行测试?

ruby - 是否有等同于 RSpec 的 before( :all) in MiniTest?

ruby-on-rails - Minitest 5 - 套件级设置