私はここに行くのが新しいです...私の目的は、準備が整った状態で状態が更新されていることをユニットテストすることです。私はhttps://engineering.aircto.com/writing-testable-code-in-golang/を見ていて、自分が行っていることを自分のユースケースに適応させる方法を見つけようとしています。私ができるところでゴラン知識のギャップを埋めています。テストの依存関係を模擬するためにstruct/interfaceを使用する方法
私は準備ができてに、引数に*型としてdiscordgo.SessionをfakeSession(タイプ* FakeSession)を使用することはできませんエラーを取得していますが、私はよく分からない私はこのエラーを取得していますなぜ。
main.go
import (
"fmt"
"os"
"os/signal"
"syscall"
"github.com/bwmarrin/discordgo"
)
var (
// bot token used for this bot when connecting
token = os.Getenv("DISCORD_BOT_TOKEN")
status = os.Getenv("BOT_STATUS")
)
func main() {
// initiate Discord bot
// Register ready as a callback for the ready events.
discordConnection.AddHandler(ready)
// running the app, waiting to receive a close signal
}
// This function will be called (due to AddHandler above) when the bot receives
// the "ready" event from Discord.
func ready(session *discordgo.Session, event *discordgo.Ready) {
// Set the playing status.
session.UpdateStatus(0, status)
}
main_test.go
type FakeSession struct {
status string
idle int
}
func (f *FakeSession) UpdateStatus(idle int, game string) error {
f.idle, f.status = idle, game
return nil
}
func TestStatusIsUpdated(t *testing.T) {
readyDependency := &discordgo.Ready{}
fakeSession := &FakeSession{}
ready(fakeSession, readyDependency)
// @todo assert that idle/game status were set to correct values
}
* discordgo.Sessionはインターフェイスではなく構造体に見えます。 – Andrew
@Andrewあなたは正しいです、私はhttps://godoc.org/github.com/bwmarrin/discordgo#Sessionのリンクを含めるつもりでした。あなたは私がその影響を理解するのを助けることができますか? – Webnet
@Webnet:goは静的に型指定されていますが、ある具体的な型を別の型に置き換えることはできません。 'ready'を、必要なメソッドだけを公開しているインターフェースを取る関数に置き換えることができるかもしれませんが、' ready'は何もしませんが、 'TestStatus'を呼び出します。 – JimB