Heim  >  Artikel  >  Backend-Entwicklung  >  So überschreiben Sie Mock-Call-Erwartungen in tabellengesteuerten Tests

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

WBOY
WBOYnach vorne
2024-02-10 21:42:09842Durchsuche

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)
        })
    }
}

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)
        })
    }
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen