@@ -112,3 +112,104 @@ func TestQueryError(t *testing.T) {
112112		t .Errorf ("expected ErrNoRows, got %v" , err )
113113	}
114114}
115+ 
116+ func  TestGetMultipleUsers (t  * testing.T ) {
117+ 	// 1. 创建 mock 数据库 
118+ 	mockDB  :=  sqlmock .NewMock ()
119+ 
120+ 	// 2. 期望一个查询并设置返回值 
121+ 	mockDB .ExpectQuery ("SELECT id, name, age FROM users" ).
122+ 		WillReturnRows ([]string {"id" , "name" , "age" }, [][]driver.Value {
123+ 			{1 , "John Doe" , 30 },
124+ 			{2 , "Alice" , 25 },
125+ 		})
126+ 
127+ 	// 3. 打开数据库连接 
128+ 	db , err  :=  mockDB .Open ("mock" )
129+ 	if  err  !=  nil  {
130+ 		t .Fatalf ("failed to open database: %v" , err )
131+ 	}
132+ 
133+ 	// 4. 创建仓库实例 
134+ 	repo  :=  & UserRepository {db : db }
135+ 
136+ 	// 5. 执行测试 
137+ 	rows , err  :=  repo .db .Query ("SELECT id, name, age FROM users" )
138+ 	if  err  !=  nil  {
139+ 		t .Fatalf ("unexpected error: %v" , err )
140+ 	}
141+ 	defer  rows .Close ()
142+ 
143+ 	var  users  []User 
144+ 	for  rows .Next () {
145+ 		var  user  User 
146+ 		if  err  :=  rows .Scan (& user .ID , & user .Name , & user .Age ); err  !=  nil  {
147+ 			t .Fatalf ("unexpected error: %v" , err )
148+ 		}
149+ 		users  =  append (users , user )
150+ 	}
151+ 
152+ 	// 6. 验证结果 
153+ 	if  len (users ) !=  2  {
154+ 		t .Errorf ("expected 2 users, got %d" , len (users ))
155+ 	}
156+ 
157+ 	expectedUsers  :=  []User {
158+ 		{ID : 1 , Name : "John Doe" , Age : 30 },
159+ 		{ID : 2 , Name : "Alice" , Age : 25 },
160+ 	}
161+ 
162+ 	for  i , user  :=  range  users  {
163+ 		if  user  !=  expectedUsers [i ] {
164+ 			t .Errorf ("unexpected user at index %d: %+v" , i , user )
165+ 		}
166+ 	}
167+ }
168+ 
169+ func  TestMultipleQueries (t  * testing.T ) {
170+ 	// 1. 创建 mock 数据库 
171+ 	mockDB  :=  sqlmock .NewMock ()
172+ 
173+ 	// 2. 期望多个查询并设置返回值 
174+ 	mockDB .ExpectQuery ("SELECT id, name, age FROM users WHERE id = ?" ).
175+ 		WithArgs (1 ).
176+ 		WillReturnRows ([]string {"id" , "name" , "age" }, [][]driver.Value {
177+ 			{1 , "John Doe" , 30 },
178+ 		})
179+ 
180+ 	mockDB .ExpectQuery ("SELECT id, name FROM users WHERE name = ?" ).
181+ 		WithArgs ("Alice" ).
182+ 		WillReturnRows ([]string {"id" , "name" }, [][]driver.Value {
183+ 			{2 , "Alice" },
184+ 		})
185+ 
186+ 	// 3. 打开数据库连接 
187+ 	db , err  :=  mockDB .Open ("mock" )
188+ 	if  err  !=  nil  {
189+ 		t .Fatalf ("failed to open database: %v" , err )
190+ 	}
191+ 
192+ 	// 4. 创建仓库实例 
193+ 	repo  :=  & UserRepository {db : db }
194+ 
195+ 	// 5. 执行测试 
196+ 	user1 , err  :=  repo .GetUserByID (1 )
197+ 	if  err  !=  nil  {
198+ 		t .Fatalf ("unexpected error: %v" , err )
199+ 	}
200+ 
201+ 	var  user2  User 
202+ 	err  =  repo .db .QueryRow ("SELECT id, name FROM users WHERE name = ?" , "Alice" ).Scan (& user2 .ID , & user2 .Name )
203+ 	if  err  !=  nil  {
204+ 		t .Fatalf ("unexpected error: %v" , err )
205+ 	}
206+ 
207+ 	// 6. 验证结果 
208+ 	if  user1 .ID  !=  1  ||  user1 .Name  !=  "John Doe"  ||  user1 .Age  !=  30  {
209+ 		t .Errorf ("unexpected user: %+v" , user1 )
210+ 	}
211+ 
212+ 	if  user2 .ID  !=  2  ||  user2 .Name  !=  "Alice"  {
213+ 		t .Errorf ("unexpected user: %+v" , user2 )
214+ 	}
215+ }
0 commit comments