如何使用 Minitest 拆分测试方法以便在多种情况下重用?
How can I split test methods for reuse in multiple case with Minitest?
我阻止重构我的 Minitest 文件中的代码。
我有这个例子:
test_calls.rb
describe Aircall::Calls do
before do
@call_by_id = DefaultAircall::AIRCALL.calls.get_by_id(34043501)
@call_by_user_id = DefaultAircall::AIRCALL.calls.get_by_user_id(80603)
end
describe "By id" do
it "is Hash" do
@call_by_id.must_be_instance_of Hash
end
it "no error return" do
@call_by_id['error'].must_be_nil
end
end
describe "by user id" do
it "is Hash" do
@call_by_user_id.must_be_instance_of Hash
end
it "no error return" do
@call_by_user_id['error'].must_be_nil
end
end
end
test_users.rb
describe Aircall::Users do
describe "By id" do
before do
@user_by_id = DefaultAircall::AIRCALL.users.get_by_id(80603)
end
it "is Hash" do
@user_by_id.must_be_instance_of Hash
end
it "no error return" do
@user_by_id['error'].must_be_nil
end
end
end
理想情况下,我想将我的代码拆分到另一个文件中,如下所示:
class DefaultTest
def initialize(element_to_test)
@element_to_test = element_to_test
end
def defaults_tests
describe "default" do
it "is Hash" do
@element_to_test.must_be_instance_of Hash
end
it "no error return" do
@element_to_test['error'].must_be_nil
end
end
end
end
所以,我可以在不同的测试文件中导入我的默认测试。
我不知道这是否可能以及如何实现。我想我已经成功了一次,但是测试没有出现在控制台中。如果我调用一个 class 方法 运行 一些 Minitest 测试,我的任务(运行 测试)不考虑我的默认测试。
据我所知,您无法完成您想要做的事情。这里的问题是 it
只能从 describe
块中调用。 it
将无法在该块调用 的方法中使用。
我做了一些实验。我能想到的最好办法是,可以在 describe
块中定义一个 lambda,并由该 describe
中的所有 it
块使用。 (这样用常规方法是不行的。)
这是一个例子:
require "minitest/autorun"
class MyTest < Minitest::Test
describe 'number test' do
# It is not legal to define a method here,
# you'll get this error when trying to call it:
# "undefined method `is_odd'"
# def is_odd(number)
# it 'is odd' do
# assert_equal (number / 2), 1
# end
# end
is_odd_lambda = ->(number) do
it 'is odd' do
assert_equal (number / 2), 1
end
end
# is_odd(3)
is_odd_lambda.(3)
end
end
调用is_odd
方法会出错,但调用is_odd_lambda
不会。
Keith Bennett 好主意! Lambda 是一个很好的方法。
我现在有了解决方案:
我的 lambda 模块 运行 默认测试: default_tests.rb
module DefaultTest
Run = ->(*variables_to_test) do
describe "Default test" do
variables_to_test.each do |variable|
it "is Hash" do
self.class.send(variable).must_be_instance_of Hash
end
it "no error return" do
self.class.send(variable)['error'].must_be_nil
end
end
end
end
end
test_contacts.rb
module TestAircall
describe Aircall::Contacts do
def self.contact_by_id
@contact_by_id ||= DefaultAircall::AIRCALL.contacts.get_by_id(ENV['TEST_DEFAULT_CONTACT_ID'])
end
def self.contact_by_phone_number
@contact_by_phone_number ||= DefaultAircall::AIRCALL.contacts.get_by_phone_number(ENV['TEST_DEFAULT_PHONE_NUMBER'])
end
def self.contact_by_email
@contact_by_email ||= DefaultAircall::AIRCALL.contacts.get_by_email(ENV['TEST_DEFAULT_EMAIL'])
end
DefaultTest::Run.('contact_by_id', 'contact_by_phone_number', 'contact_by_email')
end
end
test_users.rb
module TestAircall
describe Aircall::Users do
def self.user_by_id
@user_by_id ||= DefaultAircall::AIRCALL.users.get_by_id(ENV['TEST_DEFAULT_USER_ID'])
end
DefaultTest::Run.('user_by_id')
end
end
我可以在每个文件测试中调用并 运行 我的默认测试来测试任何变量。