diff --git a/tests/route/test-fib.cpp b/tests/route/test-fib.cpp
index 9da37de..a902eb7 100644
--- a/tests/route/test-fib.cpp
+++ b/tests/route/test-fib.cpp
@@ -59,17 +59,18 @@
   void
   enableRegistrationReplyWithFaceId()
   {
-    face.onSendInterest.connect([this] (const ndn::Interest& interest) {
-      static const ndn::Name localhostRegistration("/localhost/nfd/rib");
-      if (!localhostRegistration.isPrefixOf(interest.getName()))
+    face.onSendInterest.connect([this] (const auto& interest) {
+      if (!RIB_COMMAND_PREFIX.isPrefixOf(interest.getName()))
         return;
 
-      ndn::nfd::ControlParameters params(interest.getName().get(-5).blockFromValue());
+      ndn::name::Component verb;
+      ndn::nfd::ControlParameters params;
+      extractRibCommandParameters(interest, verb, params);
       if (!params.hasFaceId()) {
         params.setFaceId(1);
       }
       params.setOrigin(ndn::nfd::ROUTE_ORIGIN_APP);
-      if (interest.getName().get(3) == ndn::name::Component("register")) {
+      if (verb == ndn::name::Component("register")) {
         params.setCost(0);
       }
 
@@ -79,7 +80,6 @@
 
       ndn::Data data(interest.getName());
       data.setContent(resp.wireEncode());
-
       m_keyChain.sign(data, ndn::security::SigningInfo(ndn::security::SigningInfo::SIGNER_TYPE_SHA256));
 
       face.getIoService().post([this, data] { face.receive(data); });
@@ -87,23 +87,22 @@
   }
 
   static void
-  extractRibCommandParameters(const ndn::Interest& interest, ndn::Name::Component& verb,
-                              ndn::nfd::ControlParameters& extractedParameters)
+  extractRibCommandParameters(const ndn::Interest& interest,
+                              ndn::Name::Component& verb,
+                              ndn::nfd::ControlParameters& params)
   {
-    static const ndn::Name commandPrefix("/localhost/nfd/rib");
-
     const auto& name = interest.getName();
-    verb = name.at(commandPrefix.size());
-    const auto& paramComponent = name.at(commandPrefix.size() + 1);
-    extractedParameters.wireDecode(paramComponent.blockFromValue());
+    verb = name.at(RIB_COMMAND_PREFIX.size());
+    params.wireDecode(name.at(RIB_COMMAND_PREFIX.size() + 1).blockFromValue());
   }
 
 private:
+  static inline const ndn::Name RIB_COMMAND_PREFIX{"/localhost/nfd/rib"};
+
   ndn::Scheduler m_scheduler{m_io};
 
 public:
   ndn::util::DummyClientFace face{m_io, m_keyChain};
-
   ConfParameter conf{face, m_keyChain};
   AdjacencyList& adjacencies;
   Fib fib;
diff --git a/tests/test-common.cpp b/tests/test-common.cpp
index 3a1ffeb..388cb23 100644
--- a/tests/test-common.cpp
+++ b/tests/test-common.cpp
@@ -22,8 +22,7 @@
 
 #include <ndn-cxx/mgmt/nfd/control-parameters.hpp>
 
-namespace nlsr {
-namespace test {
+namespace nlsr::test {
 
 std::shared_ptr<ndn::Data>
 makeData(const ndn::Name& name)
@@ -46,10 +45,9 @@
 {
   bool registerCommandEmitted = false;
   for (const auto& interest : face.sentInterests) {
-    if (interest.getName().size() > 4 &&
-        interest.getName().get(3) == ndn::name::Component("register")) {
-      auto test = interest.getName().get(4);
-      ndn::nfd::ControlParameters params(test.blockFromValue());
+    const auto& name = interest.getName();
+    if (name.size() > 4 && name[3] == ndn::name::Component("register")) {
+      ndn::nfd::ControlParameters params(name[4].blockFromValue());
       if (params.getName() == prefix) {
         registerCommandEmitted = true;
         break;
@@ -59,5 +57,4 @@
   BOOST_CHECK(registerCommandEmitted);
 }
 
-} // namespace test
-} // namespace nlsr
+} // namespace nlsr::test
diff --git a/tests/test-lsdb.cpp b/tests/test-lsdb.cpp
index ec2668b..add6706 100644
--- a/tests/test-lsdb.cpp
+++ b/tests/test-lsdb.cpp
@@ -43,8 +43,6 @@
     , conf(face, m_keyChain)
     , confProcessor(conf)
     , lsdb(face, m_keyChain, conf)
-    , REGISTER_COMMAND_PREFIX("/localhost/nfd/rib")
-    , REGISTER_VERB("register")
   {
     m_keyChain.createIdentity("/ndn/site/%C1.Router/this-router");
 
@@ -53,16 +51,6 @@
   }
 
   void
-  extractParameters(ndn::Interest& interest, ndn::Name::Component& verb,
-                    ndn::nfd::ControlParameters& extractedParameters)
-  {
-    const ndn::Name& name = interest.getName();
-    verb = name[REGISTER_COMMAND_PREFIX.size()];
-    const ndn::Name::Component& parameterComponent = name[REGISTER_COMMAND_PREFIX.size() + 1];
-    extractedParameters.wireDecode(parameterComponent.blockFromValue());
-  }
-
-  void
   areNamePrefixListsEqual(NamePrefixList& lhs, NamePrefixList& rhs)
   {
     auto lhsList = lhs.getNames();
@@ -127,9 +115,6 @@
   DummyConfFileProcessor confProcessor;
   Lsdb lsdb;
 
-  ndn::Name REGISTER_COMMAND_PREFIX;
-  ndn::Name::Component REGISTER_VERB;
-
   LsdbUpdate updateTypeCheck = LsdbUpdate::INSTALLED;
   std::list<ndn::Name> namesToAddCheck;
   std::list<ndn::Name> namesToRemoveCheck;
