我在使用Minitest的Ruby应用程序中开始使用DDD和TDD。 我创建了一个存储库类(没有数据库访问,但它为我生成实体)。这是一个单身人士。我如何测试(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成功,如果最后执行的失败。
我想能够测试存储库(因为它会演变成更大的东西)。我怎样才能做到这一点?
谢谢!
单身人士和可测试性往往不一致。考虑使用某种类型的DI来执行单例,而不是让班级担心这一点。 – 2014-10-02 23:10:02
@MattBall这将是伟大的。你会有任何关于如何使用DI解决这个问题的参考? – JSBach 2014-10-02 23:54:01
没什么特别的;我不写Ruby。看看:http://stackoverflow.com/search?q=ruby+dependency+injection – 2014-10-03 01:15:08