谁能告诉我如何使用sqlmock模拟下面的函数

时间:2019-07-12 18:04:25

标签: go go-sqlmock

  • 我是sqlmock的新手。想为下面的功能编写模拟。但我是 收到错误消息“未预期会调用查询,下一个期望是:
    ExpectedPrepare =>期望Prepare语句:匹配sql“

    我需要帮助以了解上述错误的原因。要么 我该如何为下面的函数编写模拟?

    我的代码看起来与此类似

    >>>>>>>>>Request.go<<<<<<<<<<<<<<
    
    type Request struct{
        Username string `gorm:"column:username" json:"USerName"`
        Status string `gorm:"column:status" json:"Status"`
    
    }
    func (p *Request) TableName() string {
        return "requests"
    }
    
    //function which needs to be mocked
    type Repository interface {
        GetRequestDetails(user string)(*Request,error)
    
    }
    
    type repo struct {
        DB *gorm.DB
    }
    
    func (p *repo) GetRequestDetails(user string)(*Request,error){
        request := new(Request)
        err := p.DB.Select("*").Where("username = ?", user).Find(request ).Error
        return request,err
    }
    
    
    func CreateRepository(db *gorm.DB) Repository {
        return &repo{
            DB: db,
        }
    }
    
    
    >>>>>>>>>RequestTest.go>>>>>>>>>>>>>>>>>>>>>>>>
    
    
    type Suite struct {
        suite.Suite
        DB   *gorm.DB
        mock sqlmock.Sqlmock
        repository Repository
        request *Request
    }
    
    func (s *Suite) SetupSuite() {
        var (
            db  *sql.DB
            err error
        )
    
        db, s.mock, err = sqlmock.New()
        require.NoError(s.T(), err)
    
        s.DB, err = gorm.Open("mysql", db)
        require.NoError(s.T(), err)
    
        s.DB.LogMode(true)
    
        s.repository = CreateRepository(s.DB)
    }
    
    func TestInit(t *testing.T) {
        suite.Run(t, new(Suite))
    }
    
    //testing function
    func (s *Suite) Test_repository_Get(){
    rows := sqlmock.NewRows([]string{"username", "status"}).
            AddRow("post 1", "hello").
            AddRow("post 2", "world")
        s.mock.ExpectPrepare("SELECT * FROM requests WHERE username = ?").ExpectQuery().WithArgs("post 1").WillReturnRows(rows)
        res,_ := s.repository.GetRequestDetails("post 1")
        require.NoError(s.T(), err)
        fmt.Println(res)
    
    }
    

    出现错误,但原因是什么?如何修改上面的实现以使其起作用

0 个答案:

没有答案