【问题标题】:How do I test (TDD) a singleton class?如何测试 (TDD) 单例类?
【发布时间】:2014-10-02 23:07:50
【问题描述】:

我从使用 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成功,最后执行失败。

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

谢谢!

【问题讨论】:

标签: ruby tdd minitest


【解决方案1】:

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

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

【讨论】:

【解决方案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

【讨论】:

  • 哇,这是一个意想不到的方法名称:p 我将尝试更改我的架构以避免使用这个。任何想法
  • 顺便说一下,测试本身不依赖于顺序。问题是我希望有一个给定的值,但使用的实例不是“新鲜的”,因为它是一个单例。解决单例问题解决了顺序依赖问题
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2011-11-16
  • 2011-03-14
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多