【问题标题】:Error: suite.go:61: test panicked: reflect: Call with too few input arguments错误:suite.go:61: test panicked: reflect: Call with too little input arguments
【发布时间】:2019-09-09 05:37:04
【问题描述】:

我正在golang 中设置单元测试。
但是现在我在运行 go test -v 时遇到了错误。
我想解决这个错误并让测试成功。

article
  ├ client
  ├ api
  │  ├ main.go
  │  ├ contoroller
  │  │    ├ contoroller.go
  │  │    └ contoroller_test.go
  │  ├ service
  │  │    ├ service.go
  │  │    └ service_test.go
  │  ├ dao
  │  │    ├ dao.go
  │  │    └ dao_test.go
  │  ├ s3
  │  │    ├ s3.go
  │  │    └ s3_test.go
  │  ├ go.mod 
  │  ├ go.sum
  │  └ Dockerfile
  ├ nginx
  └ docker-compose.yml

现在我将service_test.go 设置为service.go

service_test.go

package service

// import

type MockDaoInterface struct {
}

func (_m *MockDaoInterface) GetArticleDao() *sql.Rows {
    db, mock, _ := sqlmock.New()
    mockRows := mock.NewRows([]string{"id", "uuid", "title", "content"}).
        AddRow(1, "bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c", "test", "test").
        AddRow(2, "844bc620-7336-41a3-9cb4-552a0024ff1c", "test2", "test2")
    mock.ExpectQuery("select").WillReturnRows(mockRows)
    rows, _ := db.Query("select")
    return rows
}


type ServiceSuite struct {
    suite.Suite
    service *Service
    dao     dao.DaoInterface
}

func (s *ServiceSuite) SetupTest() {
    s.service = NewService(s.dao)
    s.service.dao = &MockDaoInterface{}
}

func (s *ServiceSuite) TestGetArticleService(t *testing.T) {

    articles := s.service.GetArticleService()

    var expectedArticles []util.Article

    expectedArticle1 := util.Article{
        ID:      1,
        UUID:    "bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c",
        TITLE:   "test",
        CONTENT: "test",
    }
    expectedArticles = append(expectedArticles, expectedArticle1)

    expectedArticle2 := util.Article{
        ID:      2,
        UUID:    "844bc620-7336-41a3-9cb4-552a0024ff1c",
        TITLE:   "test2",
        CONTENT: "test2",
    }
    expectedArticles = append(expectedArticles, expectedArticle2)

    assert.Equal(s.T(), expectedArticles, articles)
}

func TestServiceSuite(t *testing.T) {
    suite.Run(t, new(ServiceSuite))
}

service.go

package service

// import 

type Service struct {
    dao dao.DaoInterface
}

func NewService(dao dao.DaoInterface) *Service {
    return &Service{dao: dao}
}

func (s Service) GetArticleService() []util.Article {
    var articles []util.Article

    results := s.dao.GetArticleDao()

    article := util.Article{}
    for results.Next() {
        err := results.Scan(&article.ID, &article.UUID, &article.TITLE, &article.CONTENT)
        if err != nil {
            panic(err.Error())
        } else {
            articles = append(articles, article)
        }
    }
    return articles
}

dao.go

package dao

// import

type Dao struct {
    database *sql.DB
    s3       s3.S3Interface
}

func NewDao(database *sql.DB, s3 s3.S3Interface) *Dao {
    objs := &Dao{database: database, s3: s3}
    return objs
}

type DaoInterface interface {
    GetArticleDao() *sql.Rows
}

这里是完整的源代码(分支:go-test-service)
https://github.com/jpskgc/article/tree/go-test-service

我希望 service_test.go 能够成功测试。
但实际情况是它失败并出现错误。
我想解决这个错误并成功测试。

$ go test -v
=== RUN   TestServiceSuite
=== RUN   TestServiceSuite/TestGetArticleService
--- FAIL: TestServiceSuite (0.00s)
    --- FAIL: TestServiceSuite/TestGetArticleService (0.00s)
        suite.go:61: test panicked: reflect: Call with too few input arguments
FAIL
exit status 1
FAIL    article/api/service     0.045s

【问题讨论】:

  • 在修复此错误之前,您需要认真开始关闭返回的*sql.Rows 对象。请参阅database/sql 文档,了解如何正确使用该类型的结果。如果你不这样做,你的程序会因为打开的连接太多而不断崩溃。

标签: unit-testing go testify


【解决方案1】:

已通过从 aurgument 中删除 t *testing.T 来解决。

func (s *ServiceSuite) TestGetArticleService() {
// some code
}

【讨论】:

  • @TehSphinX,从参数中删除 t *testing.T 是正确的。用户正在使用包“suite”,我们不需要发送“t *testing.T”参数,因为go test不会直接运行这个测试函数TestGetArticleService,但“suite”会。要获取测试上下文,需要在函数中使用 suite.T()。
  • 你必须使用套件中的 T()
  • @VanagaS 是正确的,你需要使用suite.T(),谢谢!
【解决方案2】:

我遇到了同样的问题

type AnswerApplicationSvcTestSuite struct {
    mock.Mock
    suite.Suite
    svc                   *answerApplicationService
}

我的问题是犹豫是否同时嵌套 mock.Mock 和 suete.Suite

我试图删除 mock.Mock

然后就恢复正常了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-12-29
    • 2012-11-26
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多