Eu tenho um objeto simulado PHPUnit que retorna, 'return value'
independentemente de seus argumentos:
// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
->method('methodToMock')
->will($this->returnValue('return value'));
O que eu quero poder fazer é retornar um valor diferente com base nos argumentos passados para o método mock. Eu tentei algo como:
$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"'));
Mas isso faz com que o PHPUnit se queixe se o mock não for chamado com o argumento 'two'
, então suponho que a definição de methodToMock('two')
sobrescreva a definição do primeiro.
Então, minha pergunta é: Existe alguma maneira de obter um objeto mock do PHPUnit para retornar um valor diferente com base em seus argumentos? E se sim, como?
fonte
$this->returnCallback(array('MyClassTest','myCallback'))
.$this->returnCallback(function() { // ... })
Dos documentos mais recentes do phpUnit: "Às vezes, um método stubbed deve retornar valores diferentes, dependendo de uma lista predefinida de argumentos. Você pode usar returnValueMap () para criar um mapa que associe argumentos aos valores de retorno correspondentes."
fonte
Eu tive um problema semelhante (embora um pouco diferente ... eu não precisava de um valor de retorno diferente com base em argumentos, mas tive que testar para garantir que dois conjuntos de argumentos estavam sendo transmitidos para a mesma função). Eu tropecei em usar algo como isto:
Não é perfeito, pois exige que a ordem das 2 chamadas para foo () seja conhecida, mas na prática isso provavelmente não é tão ruim.
fonte
Você provavelmente desejaria fazer um retorno de chamada da maneira OOP:
fonte
Não é exatamente o que você pergunta, mas, em alguns casos, pode ajudar:
onConsecutiveCalls - retorna uma lista de valores na ordem especificada
fonte
Passe uma matriz de dois níveis, em que cada elemento é uma matriz de:
exemplo:
fonte
Você também pode retornar o argumento da seguinte maneira:
Como você pode ver na documentação de zombaria , o método
returnValue($index)
permite retornar o argumento fornecido.fonte
Você quer dizer algo assim?
fonte
Eu tive um problema semelhante que também não consegui resolver (há surpreendentemente pouca informação sobre o PHPUnit). No meu caso, acabei de fazer cada teste separadamente - entrada e saída conhecidas. Percebi que não precisava criar um objeto fictício de pau para toda obra, só precisava de um específico para um teste específico e, portanto, separei os testes e posso testar aspectos individuais do meu código como um separado. unidade. Não tenho certeza se isso pode ser aplicável a você ou não, mas isso depende do que você precisa testar.
fonte
fonte
Experimentar :
fonte