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

JSB*_*ach 2 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
Run Code Online (Sandbox Code Playgroud)

测试:

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
Run Code Online (Sandbox Code Playgroud)

assert_equal(0, index_participant1.to_i)首先执行test_employee_name_increment时断言成功,如果最后执行则失败.

我希望能够测试存储库(因为它将演变成更大的东西).我怎样才能做到这一点?

谢谢!

Mic*_*ffe 5

订购您的测试无关紧要.要正确测试单例类,您需要将其视为实例对象.为此,请在安装过程中将单例包装在匿名类中.每次调用setup时,您都会获得ParticipantRepository的未经修改的副本:

def setup
  @repository = Class.new(ParticipantRepository).instance
end
Run Code Online (Sandbox Code Playgroud)