Mam obiekt makiety PHPUnit, który zwraca 'return value'
niezależnie od argumentów:
// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
->method('methodToMock')
->will($this->returnValue('return value'));
Chcę mieć możliwość zwrócenia innej wartości na podstawie argumentów przekazanych do metody mock. Próbowałem czegoś takiego:
$mock = $this->getMock('myObject', 'methodToMock');
// methodToMock('one')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('one'))
->will($this->returnValue('method called with argument "one"'));
// methodToMock('two')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('two'))
->will($this->returnValue('method called with argument "two"'));
Ale to powoduje, że PHPUnit narzeka, jeśli makieta nie zostanie wywołana z argumentem 'two'
, więc zakładam, że definicja methodToMock('two')
nadpisuje definicję pierwszej.
Moje pytanie brzmi: czy istnieje sposób, aby obiekt makiety PHPUnit zwracał inną wartość na podstawie jego argumentów? A jeśli tak, to w jaki sposób?
php
unit-testing
mocking
phpunit
Ben Dowling
źródło
źródło
$this->returnCallback(array('MyClassTest','myCallback'))
.$this->returnCallback(function() { // ... })
Z najnowszej dokumentacji phpUnit: "Czasami metoda typu stub powinna zwracać różne wartości w zależności od predefiniowanej listy argumentów. Możesz użyć funkcji returnValueMap (), aby utworzyć mapę, która kojarzy argumenty z odpowiadającymi im wartościami zwracanymi."
źródło
Miałem podobny problem (chociaż trochę inny ... Nie potrzebowałem innej wartości zwracanej na podstawie argumentów, ale musiałem przetestować, aby upewnić się, że 2 zestawy argumentów są przekazywane do tej samej funkcji). Natknąłem się na użycie czegoś takiego:
Nie jest doskonały, ponieważ wymaga, aby znana była kolejność dwóch wywołań funkcji foo (), ale w praktyce prawdopodobnie nie jest tak źle.
źródło
Prawdopodobnie chciałbyś wykonać oddzwonienie w stylu OOP:
źródło
Nie jest to dokładnie to, o co pytasz, ale w niektórych przypadkach może pomóc:
onConsecutiveCalls - zwraca listę wartości w określonej kolejności
źródło
Przekaż dwupoziomową tablicę, gdzie każdy element jest tablicą:
przykład:
źródło
Możesz również zwrócić argument w następujący sposób:
Jak widać w dokumentacji Mocking , metoda
returnValue($index)
pozwala zwrócić podany argument.źródło
Masz na myśli coś takiego?
źródło
Miałem podobny problem, którego również nie mogłem rozwiązać (jest zaskakująco mało informacji o PHPUnit). W moim przypadku po prostu robiłem każdy test osobno - znane dane wejściowe i znane wyjście. Zdałem sobie sprawę, że nie muszę tworzyć pozorowanego obiektu typu jack-of-all-trade, potrzebowałem tylko konkretnego do konkretnego testu, dlatego oddzieliłem testy i mogę testować poszczególne aspekty mojego kodu jako osobne jednostka. Nie jestem pewien, czy to może mieć zastosowanie do Ciebie, czy nie, ale to zależy od tego, co musisz przetestować.
źródło
źródło
Próbować :
źródło