Hi there! I keep learning golang. Today I wrote tests and created maps 🙂
First of all I created a function using Golang’s official documentation like below:
func Greetings(names []string) (map[string]string, error) { messages := make(map[string]string) for _, name := range names { message, err := Hello(name) if err != nil { return nil, err } messages[name] = message } return messages, nil }
The above function expects a string map. It returns a string map and error. There is a loop in this function to iterate names.
If you pass an empty name to the Hello function, it will return an error.
func Hello(name string) (string, error) { if name == "" { return name, errors.New("The name can't be blank!") } message := fmt.Sprintf(randomFormat(), name) return message, nil }
I also created a random function to return random hello values 🙂
// return a random string func randomFormat() string { formats := []string{ "Hi %v. How are you?", "Merhaba %v. Nasılsın?", "Hi. I'm %v. Nice to meet you", } return formats[rand.Intn(len(formats))] }
I created a test file for this module. Every go test file should contains _test in their names.
package greetings import ( "regexp" "testing" )
The header of this test file was like above. And I created my first test:
func TestHelloName(t *testing.T) { name := "Ali" want := regexp.MustCompile(<code>{{EJS0}}</code> + name + <code>{{EJS1}}</code>) message, err := Hello(name) if !want.MatchString(message) || err != nil { t.Fatalf(<code>{{EJS2}}</code>, message, err, want) } }
The above example showed me how can I write a test. For example, your test function should starts with Test prefix. It should take a *testing.T. I think this an interface. I don’t know for now.
My second test was like that:
func TestHelloEmpty(t *testing.T) { message, err := Hello("") if message != "" || err == nil { t.Fatalf(<code>{{EJS3}}</code>, message, err) } }
All test should output Fatal. There are some format params in the string. Actually, I don’t know format params clearly for now. But, I test for empty string.
If you want to run these tests, just type this commands in your command line:
go test -v === RUN TestHelloName --- PASS: TestHelloName (0.00s) === RUN TestHelloEmpty --- PASS: TestHelloEmpty (0.00s) PASS ok github.com/aligoren/go_learn/greetings 0.002s
That’s all. I imported my local file to my new module. Now, it should work as I expected.
main.go file should be like that:
package main import ( "fmt" "log" "github.com/aligoren/go_learn/greetings" ) func main() { names := []string{"Ali", "Burak", "Can"} messages, err := greetings.Greetings(names) if err != nil { log.Fatal(err) } fmt.Println(messages) }
I ran this command:
go run . map[Ali:Hi Ali. How are you? Burak:Hi. I'm Burak. Nice to meet you Can:Hi Can. How are you?]
That’s all 🙂
You can check my GitHub repository for these two modules.
Thanks for reading ^_^