我开始使用 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/