Je suis un programmeur expérimenté mais encore nouveau. J'écris quelques tests de journalisation et à ces fins j'ai généré logsink
类的模拟(使用 mockgen
). Étant donné que toute cette partie est générée automatiquement, je pense que nous pouvons supposer qu’il n’y a aucun problème.
Voici mon code de test :
func TestLogging(t *testing.T) { ls := mock.NewMockLogSink(gomock.NewController(t)) ls.EXPECT().Init(gomock.Any()) const logLevel = 1 ls.EXPECT().Enabled(gomock.Any()).AnyTimes().Do(func(level int) bool { return level <= logLevel }) log.Set(logr.New(ls)) ls.EXPECT().Info(gomock.Any(), "Foo").Times(1) log.Info("Foo") ls.EXPECT().Info(gomock.Any(), "Bar").Times(0) log.V(2).Info("Bar") }
Mais ce test échoue car le journal "foo" n'est jamais appelé. J'ai parcouru le code et trouvé mon expect().do()
代码按预期被调用,并返回 true
,但在模拟代码中,它将 logger.sink.enabled()
的结果视为 false
!
Qu'est-ce que j'ai fait de mal ? Est-ce qu'il me manque un interrupteur secret ?
Eh bien, il s'avère que .do()
intentionnellement ignore la valeur de retour. Voici la documentation dans le code :
// Do declares the action to run when the call is matched. The function's // return values are ignored to retain backward compatibility. To use the // return values call DoAndReturn.
Compatibilité ascendante. correct. Un foutu gouffre du domaine public, si vous me demandez...
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!