So überschreiben Sie Mock-Call-Erwartungen in tabellengesteuerten Tests

WBOY
Freigeben: 2024-02-10 21:42:09
nach vorne
845 Leute haben es durchsucht

So überschreiben Sie Mock-Call-Erwartungen in tabellengesteuerten Tests

Der Herausgeber von PHP, Xiaoxin, stellt Ihnen heute eine Methode zum Überschreiben von Simulationsaufruferwartungen in tabellengesteuerten Tests vor. Tabellengesteuertes Testen ist eine effektive Testtechnologie, die datengesteuert testen und die Wartbarkeit und Skalierbarkeit des Codes verbessern kann. Beim Testen müssen wir häufig Aufruferwartungen simulieren, um sicherzustellen, dass sich der zu testende Code wie erwartet verhält. In diesem Artikel wird detailliert beschrieben, wie tabellengesteuerte Tests verwendet werden können, um die gewünschte Abdeckung von Scheinaufrufen zu erreichen und Entwicklern dabei zu helfen, Unit-Tests besser durchzuführen.

Frageninhalt

Beim tabellengesteuerten Testen verwende ich einige von mockery generierte Mocks und lege einige Methodenaufruferwartungen fest, die von den im Datensatz für jeden Testfall bereitgestellten Daten abhängen. Das Problem, mit dem ich konfrontiert bin, besteht darin, dass der Scheinaufruf immer die im ersten Testfall erwartete Ergebnismenge zurückgibt und nicht die für den ausgeführten Testfall definierte Ergebnismenge.

func (s *MyTestSuite) TestMySampleTest() {
    testCases := []struct {
        Name     string
        Requests []*service.CreateCredentialRequest
    }{
        {
            Name:     "first case",
            mockedResult: 1,
            expected: 1,
        },
        {
            Name:     "second case",
            mockedResult: 2,
            expected: 2,
        },
    }

    for _, tc := range testCases {
        s.Run(tc.Name, func() {
            s.someMock.On("SomeMethodCall", mock.Anything).Return(tc.mockedResult)

            result := s.SUT.SomeMethodThatCallsTheMockedObe()

            s.Equal(expected, result)
        })
    }
}
Nach dem Login kopieren

Wenn ich diesen Test ausführe, schlägt der zweite Fall fehl, weil das Ergebnis 1 而不是预期的 2 ,我可以看到问题是模拟方法返回 1 (为第一个测试用例设置的值)而不是 2 ist (der für den aktuellen Testfall festgelegte Wert).

Irgendeine Idee, wie man dieses Problem lösen kann?

Workaround

Dies ist möglicherweise nicht die eleganteste Lösung und ich habe mich gefragt, ob es noch andere Möglichkeiten gibt, dies zu tun, aber im Moment habe ich diese Lösung gefunden. Dabei wird für jeden Subtest, der vom tabellengesteuerten Test ausgeführt wird, ein neues Mock generiert. Daher verwenden wir in jedem Subtest eine völlig neue Mock-Instanz, die keinerlei Erwartungen an den vorherigen Subtest weckt. Wenn man bedenkt, dass ich testify.suite 来组织和处理我的测试,这样做就像在每个子测试中手动调用 s.setuptest() verwende, ist die Methode genauso einfach:

// SetupTest is executed before every test is run, I instantiate the SUT and 
// its dependencies here.
func (s *MyTestSuite) SetupTest() {
    // Instantiate the mock
    s.someMock = mocks.NewSomeMock(s.T())
    // Instantiate the SUT, injecting the mock through the constructor function
    s.SUT = NewSUT(s.someMock)
}

func (s *MyTestSuite) TestMySampleTest() {
    testCases := []struct {
        Name     string
        Requests []*service.CreateCredentialRequest
    }{
        // test cases here 
    }

    for _, tc := range testCases {
        s.Run(tc.Name, func() {
            // Manually calling s.SetupTest() to generate new instances of the mocks in every subtest.
            // If we don't do this, the mock will always return the first expectation set (the one set for the first test case).
            s.SetupTest()

            // Here comes the logic of the text as we had it before
            s.someMock.On("SomeMethodCall", mock.Anything).Return(tc.mockedResult)

            result := s.SUT.SomeMethodThatCallsTheMockedObe()

            s.Equal(expected, result)
        })
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo überschreiben Sie Mock-Call-Erwartungen in tabellengesteuerten Tests. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!