There's a few things:
- Your module names are wrong (aka require doesn't take filenames)
- Your require syntax is wrong (aka require is a function, not a magic keyword)
- You're not using your own data structure properly
Let's go through them one by one:
You build module names using the directory, followed by a slash, then the filename, so for test1.lua, the resulting string is "testFolder/test1.lua", the correct module name for this file (which is what require takes) is "testFolder.test1". The simple solution here would be to first replace the slash by a dot, then instead of appending f, appending something like f:match("^(.+)%.lua") (which returns the name without the extension).
Also, require is a function like any other, and can indeed be re-implemented in lua! Thus, your syntax is wrong. If you're not thinking "But I've seen require 'stuff' before!", that's correct, lua allows you to skip parentheses on any one-argument function,
if that argument is a literal string or table. In this case, it isn't, so the correct syntax will be require(x) (and the tostring is unnecessary, the module name is always a string).
Now the last point, if this worked, you're trying to call 'v:say()', but, at least in test1.lua, that corresponds to 'test:say()'. But test doesn't have a say function! You probably want to either call init, then call say on the result (so: v.init():say())) or move the say function to the test table itself.
Note that it may be more useful to store the required files with their name as the table's key, rather than a numeric one. There's also code for this floating around that will either do it recursively, and/or on any specific directory and/or lazily, perhaps there's something you can reuse?