我正在学习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: 这是我的对类
中的initdef initialize(participantOne, participantTwo)
@participantOne = participantOne
@participantTwo = participantTwo
end
和参与者类
def initialize(name, dept)
@name=name
@dept=dept
end
答案 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对象切换到模拟或存根的原因是您要显式测试调用哪些方法(因此使用模拟)或设置更复杂或耗时(因此使用存根)