Как определить, что фиктивный метод вызывается ноль раз - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь протестировать следующий метод:

//AuthenticationMiddleware Middleware which handles all of the authentication.
func AuthenticationMiddleware(context context.ContextIntf, w web.ResponseWriter, r *web.Request, next web.NextMiddlewareFunc) {
    //Check if url is one that doesn't need authorization. If not than send them to the login page.
    for _, url := range AuthMWInstance.GetInfo().nonAuthURLs {
        if url.Method == r.Method && strings.Contains(r.URL.Path, url.DomainName) {
            next(w, r)
            return
        }
    }

    if errSt := CheckForAuthorization(context, r, w); errSt != nil {
        responses.Write(w, responses.Unauthorized(*errSt))
        return
    }
    defer context.GetInfo().Session.SessionRelease(w)
    next(w, r)
}

В этом случае вызывается SessionRelease, если r содержит URL-адрес, требующий авторизации, и авторизация прошла успешно.,

Может быть важно знать, что:

type MiddlewareSt struct {
    //NonAuthUrls URLs that can be accessed without a token.
    nonAuthURLs []url.URLSt
}

type MiddlewareIntf interface {
    GetInfo() *MiddlewareSt
    CheckTokenAndSetSession(context context.ContextIntf, r *web.Request, w web.ResponseWriter,
        token string, scope string, remoteAddr string) *errors.ErrorSt
}

var AuthMWInstance MiddlewareIntf

и что возвращаемое значение CheckForAuthorization в конечном итоге зависит от AuthMWInstance

Моя стратегия тестирования

  • Создать экземпляр промежуточного программного обеспечения-заглушки для инициализации AuthMWInstance, который просто возвращает nil для CheckTokenAndSetSession (с установкой сеанса, конечно, абстрагированным для созданияСам объект-заглушка, который имеет Session) и MiddlewareSt полный подделки nonAuthURLs для GetInfo()
  • Создать макет session.Store, который для всех тестовкроме теста на здравомыслие, ожидает ноль вызовов SessionRelease.

Вероятно, стоит отметить (но предположил), что я использую testify , mockery библиотеки для насмешек и утверждений.

Тест

Реализуется таким образом:

func TestAuthenticationMiddleware(t *testing.T) {
    // bring in the errors
    sdkTesting.InitErrors()
    // create/set up the test doubles
    // mock session
    sessionMock := new(testing_mock.MockStore)
    // temporarily set AuthMWInstance to a stub
    instance := AuthMWInstance
    AuthMWInstance = &StubMiddlewareInstance{
        Session: sessionMock,
    }
    // AuthMWInstance.Session
    defer func() { AuthMWInstance = instance }()
    // fake ResponseWriter
    w := new(StubResponseWriter)
    // fake web requests
    requestWithoutAuth := new(web.Request)
    requestWithoutAuth.Request = httptest.NewRequest("GET",
        "http://example.com/logout",
        nil,
    )

    // do tests here
    t.Run("AuthorizationNotRequired", func(t *testing.T) {
        // place expectations on sessionMock, namely that it does
        //  **not** invoke `SessionRelease`
        sessionMock.On("SessionRelease", w).
            Times(0)

        AuthenticationMiddleware(new(context.Context),
            w,
            requestWithoutAuth,
            web.NextMiddlewareFunc(func(web.ResponseWriter, *web.Request) {}))

        sessionMock.AssertExpectations(t)
    })

}

Время выполнения поведения

случается следующий ложный сбой: enter image description here.Это буквально, как будто вместо:

sessionMock.On("SessionRelease", w).
            Times(0)

я был похож:

sessionMock.On("SessionRelease", w).
            Once()

NOTE session.Store.SessionRelease ничего не возвращает, поэтому ядаже не удосужился использовать Return().

Я утверждаю, что он должен быть вызван ровно ноль раз, верно?

1 Ответ

0 голосов
/ 12 сентября 2018

Я чувствую себя немного глупо за это.

Проблема заключалась в том, что я беспокоился о

sessionMock.AssertExpectations(t)

, когда я мог просто сказать

sessionMock.AssertNotCalled(t, "SessionRelease", w)

(документация по этому методу здесь )

Выполнение последнего решило проблему и сделало именно то, что я пытался выполнить.

...