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

时间:2014-10-02 23:07:51

标签: 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时成功,如果在最后执行则失败。

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

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

  

在您的帐号顶部拨打i_suck_and_my_tests_are_order_dependent!()   当您绝对需要进行有序测试时进行测试。在   这样做,你承认你很糟糕,你的测试很弱。

...我保证我没有写这个方法或文档。

有关详细信息,请参阅:http://www.ruby-doc.org/stdlib-2.0/libdoc/minitest/rdoc/MiniTest/Unit/TestCase.html#method-c-i_suck_and_my_tests_are_order_dependent-21