如何使用 minitest 为实例中的方法调用设置默认值?
How to set a default value for a method call in a instance with minitest?
我正在学习 ruby 和 TDD。我使用 Minitest 作为我的单元测试框架。
目前我有一个 class(对),将使用第二个 class(参与者)的两个实例进行初始化。为了对其进行单元测试,我想创建两个模拟参与者并将它们传递给初始化方法:
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 行更改为
assert_equal(participantOne.name, pair.participantOne.name) #I would like to change this line
为了将存储的参与者的值与模拟值(我想存储)进行比较,我得到
MockExpectationError: No more expects available for :name: []
说实话,我不是很懂。看来我之前设置的"expect"在我执行代码的时候已经是"used"了
这不是我要找的。我不想验证一个方法被调用了多少次,我想定义一个在给定实例中调用该方法时返回的默认值。
我如何使用 minitest 做到这一点?
我进行了一些搜索,并在 Minitest 中阅读了有关存根的信息。但据我了解,它们旨在为 class.
的每个实例存根一个方法调用
我想创建两个参与者并定义他们的姓名和部门信息,而不使用真实的class,这样我就可以将我的测试集中在被测主题上。
ps:
这是我对 class
中的初始化
def initialize(participantOne, participantTwo)
@participantOne = participantOne
@participantTwo = participantTwo
end
和参与者class
def initialize(name, dept)
@name=name
@dept=dept
end
您快要正确了。
Minitest 提供模拟和存根:
当您想要验证将调用哪些方法调用以及调用多少次时,请使用模拟。
当您需要占位符时使用存根,例如具有始终 returns 相同值的方法的对象。
您首先要测试的是 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 对象切换到模拟或存根的原因是,如果你想明确测试调用了哪些方法(所以使用模拟)或者设置更复杂,或者更耗时(所以使用存根)。
我正在学习 ruby 和 TDD。我使用 Minitest 作为我的单元测试框架。 目前我有一个 class(对),将使用第二个 class(参与者)的两个实例进行初始化。为了对其进行单元测试,我想创建两个模拟参与者并将它们传递给初始化方法:
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 行更改为
assert_equal(participantOne.name, pair.participantOne.name) #I would like to change this line
为了将存储的参与者的值与模拟值(我想存储)进行比较,我得到
MockExpectationError: No more expects available for :name: []
说实话,我不是很懂。看来我之前设置的"expect"在我执行代码的时候已经是"used"了
这不是我要找的。我不想验证一个方法被调用了多少次,我想定义一个在给定实例中调用该方法时返回的默认值。
我如何使用 minitest 做到这一点?
我进行了一些搜索,并在 Minitest 中阅读了有关存根的信息。但据我了解,它们旨在为 class.
的每个实例存根一个方法调用我想创建两个参与者并定义他们的姓名和部门信息,而不使用真实的class,这样我就可以将我的测试集中在被测主题上。
ps: 这是我对 class
中的初始化def initialize(participantOne, participantTwo)
@participantOne = participantOne
@participantTwo = participantTwo
end
和参与者class
def initialize(name, dept)
@name=name
@dept=dept
end
您快要正确了。
Minitest 提供模拟和存根:
当您想要验证将调用哪些方法调用以及调用多少次时,请使用模拟。
当您需要占位符时使用存根,例如具有始终 returns 相同值的方法的对象。
您首先要测试的是 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 对象切换到模拟或存根的原因是,如果你想明确测试调用了哪些方法(所以使用模拟)或者设置更复杂,或者更耗时(所以使用存根)。