77	"database/sql/driver" 
88	"encoding/json" 
99	"fmt" 
10+ 	"regexp" 
1011	"sync" 
1112)
1213
2324// ExpectedQuery 表示一个预期的查询 
2425type  ExpectedQuery  struct  {
2526	query    string 
27+ 	matcher  * regexp.Regexp 
2628	args     []driver.Value 
2729	rows     [][]driver.Value 
2830	columns  []string 
@@ -55,6 +57,19 @@ func (m *MockDB) ExpectQuery(query string, args ...driver.Value) *ExpectedQuery
5557	return  eq 
5658}
5759
60+ // ExpectQuery 期望一个特定的查询 
61+ func  (m  * MockDB ) Macth (matcher  string , args  ... driver.Value ) * ExpectedQuery  {
62+ 	m .mu .Lock ()
63+ 	defer  m .mu .Unlock ()
64+ 
65+ 	eq  :=  & ExpectedQuery {
66+ 		args :    args ,
67+ 		matcher : regexp .MustCompile (matcher ),
68+ 	}
69+ 	m .expected  =  append (m .expected , eq )
70+ 	return  eq 
71+ }
72+ 
5873func  (eq  * ExpectedQuery ) WithArgs (args  ... driver.Value ) * ExpectedQuery  {
5974	eq .args  =  args 
6075	return  eq 
@@ -141,6 +156,16 @@ func (ms *MockStmt) Exec(args []driver.Value) (driver.Result, error) {
141156	defer  ms .mockDB .mu .Unlock ()
142157
143158	for  i , expected  :=  range  ms .mockDB .expected  {
159+ 		if  expected .matcher  !=  nil  &&  expected .matcher .MatchString (ms .query ) &&  matchArgs (ms .mockDB .expected [i ].args , args ) {
160+ 			ms .mockDB .expected  =  append (ms .mockDB .expected [:i ], ms .mockDB .expected [i + 1 :]... )
161+ 
162+ 			if  expected .err  !=  nil  {
163+ 				return  nil , expected .err 
164+ 			}
165+ 
166+ 			return  & MockResult {}, nil 
167+ 		}
168+ 
144169		if  CompareSQL (expected .query , ms .query ) &&  matchArgs (expected .args , args ) {
145170			ms .mockDB .expected  =  append (ms .mockDB .expected [:i ], ms .mockDB .expected [i + 1 :]... )
146171
@@ -160,6 +185,16 @@ func (ms *MockStmt) Query(args []driver.Value) (driver.Rows, error) {
160185	defer  ms .mockDB .mu .Unlock ()
161186
162187	for  i , expected  :=  range  ms .mockDB .expected  {
188+ 		if  expected .matcher  !=  nil  &&  expected .matcher .MatchString (ms .query ) &&  matchArgs (ms .mockDB .expected [i ].args , args ) {
189+ 			ms .mockDB .expected  =  append (ms .mockDB .expected [:i ], ms .mockDB .expected [i + 1 :]... )
190+ 
191+ 			if  expected .err  !=  nil  {
192+ 				return  nil , expected .err 
193+ 			}
194+ 
195+ 			return  & MockRows {columns : expected .columns , rows : expected .rows }, nil 
196+ 		}
197+ 
163198		if  CompareSQL (expected .query , ms .query ) &&  matchArgs (expected .args , args ) {
164199			ms .mockDB .expected  =  append (ms .mockDB .expected [:i ], ms .mockDB .expected [i + 1 :]... )
165200
0 commit comments