कुछ समय पहले मेरे अपने कुछ परीक्षणों को पुन:सक्रिय करते समय मेरा भी ऐसा ही एक प्रश्न था, और आप इसे कुछ तरीकों से कर सकते हैं:
ए) एक निर्यातित प्रकार और एक Open
प्रदान करें या Connect
फ़ंक्शन जो इसे लौटाता है - उदा.
type DB struct {
db *sql.DB
}
// Using http://jmoiron.github.io/sqlx/ for this example, but
// it has the same interface as database/sql
func Open(opts *Options) (*DB, error) {
db, err := sqlx.Connect(opts.Driver, fmt.Sprintf("host=%s user=%s dbname=%s sslmode=%s", opts.Host, opts.User, opts.Name, opts.SSL))
if err != nil {
return nil, err
}
return &DB{db}, nil
}
... और फिर आपका प्रत्येक परीक्षण, सेटअप और टियरडाउन फ़ंक्शन लिखें जो *DB
. का एक उदाहरण लौटाते हैं कि आप अपने डेटाबेस फ़ंक्शंस को परिभाषित करते हैं (विधियों के रूप में - यानी func (db *DB) GetUser(user *User) (bool, error)
):
// Setup the test environment.
func setup() (*DB, error) {
err := withTestDB()
if err != nil {
return nil, err
}
// testOptions is a global in this case, but you could easily
// create one per-test
db, err := Open(testOptions)
if err != nil {
return nil, err
}
// Loads our test schema
db.MustLoad()
return db, nil
}
// Create our test database.
func withTestDB() error {
db, err := open()
if err != nil {
return err
}
defer db.Close()
_, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s;", testOptions.Name))
if err != nil {
return err
}
return nil
}
ध्यान दें कि यह कुछ हद तक "एकीकरण" परीक्षण है, लेकिन मैं दृढ़ता से "वास्तविक" डेटाबेस के खिलाफ परीक्षण करना पसंद करता हूं क्योंकि इंटरफ़ेस का मजाक उड़ाने से आपको अपने प्रश्नों/क्वेरी सिंटैक्स के साथ समस्याओं को पकड़ने में मदद नहीं मिलेगी।
बी) विकल्प, हालांकि आवेदन पक्ष पर कम एक्स्टेंसिबल है, वैश्विक db *sql.DB
होना है वेरिएबल जिसे आप init()
. में इनिशियलाइज़ करते हैं आपके परीक्षणों के भीतर—चूंकि परीक्षणों का कोई गारंटीकृत आदेश नहीं है, आपको init()
. का उपयोग करने की आवश्यकता होगी —और फिर वहां से अपने परीक्षण चलाएं। यानी
var db *sql.DB
func init() {
var err error
// Note the = and *not* the assignment - we don't want to shadow our global
db, err = sqlx.Connect(...)
if err != nil {
...
}
err := db.loadTestSchema
// etc.
}
func TestGetUser(t *testing.T) {
user := User{}
exists, err := db.GetUser(user)
...
}
आपको कुछ व्यावहारिक उदाहरण drone.io के GitHub रेपो , और मैं Go एप्लिकेशन की संरचना पर यह लेख (विशेषकर डीबी सामान)।