如何在minitest实例中为方法调用设置默认值?

时间:2015-06-07 18:16:13

标签: ruby unit-testing minitest

我正在学习ruby和TDD。我使用Minitest作为我的单元测试框架。 目前我有一个类(对),将使用第二个类(参与者)的两个实例进行初始化。为了对它进行单元测试,我想创建两个模拟参与者并将它们传递给初始化方法:

def test_init
    participantOne = Minitest::Mock.new
    participantOne.expect(:name, "P1")
    participantOne.expect(:dept, "D1")

    participantTwo = Minitest::Mock.new
    participantTwo.expect(:name, "P2")
    participantTwo.expect(:dept, "D2")

    pair = Pair.new(participantOne, participantTwo)

    assert_equal("P1", pair.participantOne.name) #I would like to change this line
    assert_equal("P2", pair.participantTwo.name) # and this line


end

这样可行,但不是100%正确。 如果我将断言等号线改为

assert_equal(participantOne.name, pair.participantOne.name) #I would like to change this line

为了比较存储的参与者的值和模拟的值(我想存储),我得到了

  

MockExpectationError:不再需要:name:[]

说实话,我真的不懂。似乎"期待"我之前设定已经使用了#34;在我的代码执行期间。

这不是我想要的。我不想验证调用方法的次数,我想定义在给定实例中调用方法时要返回的默认值。

如何使用minitest做到这一点?

我做了一些搜索,然后在Minitest中读到了存根。但据我所知,它们意味着为类的每个实例存根一个方法调用。

我想创建两个参与者并定义他们的名字和部门信息,而不使用真正的课程,所以我可以将我的测试集中在测试对象上。

PS: 这是我的对类

中的init
def initialize(participantOne, participantTwo)
    @participantOne = participantOne
    @participantTwo = participantTwo
end

和参与者类

def initialize(name, dept)
    @name=name
    @dept=dept
end

1 个答案:

答案 0 :(得分:3)

你接近纠正。

Minitest提供模拟和存根:

  • 当您想要验证将调用哪些方法调用以及多少次时,请使用模拟。

  • 当您需要占位符时使用存根,例如具有始终返回相同值的方法的对象。

您首先尝试测试的是您的Pair.new是否正确设置了对象。

你不需要模拟,你不需要存根;你可以使用普通的旧Ruby对象。

p1 = Object.new
p2 = Object.new
pair = Pair.new(p1, p2)
assert_equal(p1, pair.participant1)
assert_equal(p2, pair.participant2)

假设您决定添加一些复杂的Pair初始化代码,然后您想测试初始化​​代码不会意外更改参与者'名称和描述。

你不需要嘲笑,而且你不需要存根;你可以使用普通的旧Ruby对象。

p1name = "p1n"
p1desc = "p1d"
p1 = Participant.new(p1name, p1desc)

p2name = "p2n"
p2desc = "p2d"
p2 = Participant.new(p2name, p2desc)

pair = Pair.new(p1, p2)

assert_equal(p1name, pair.participantOne.name)
assert_equal(p1desc, pair.participantOne.desc)
assert_equal(p2name, pair.participantTwo.name)
assert_equal(p2desc, pair.participantTwo.desc)

以上所有都是普通的旧Ruby对象,而不是模拟或存根。

您要从普通的旧Ruby对象切换到模拟或存根的原因是您要显式测试调用哪些方法(因此使用模拟)或设置更复杂或耗时(因此使用存根)