【问题标题】:Update mockery's andReturn更新嘲讽的andReturn
【发布时间】:2016-02-22 18:01:04
【问题描述】:

我可以以某种方式更新特定 shouldReceive 的 shouldReturn 值吗?

例如,我有几个测试使用一个返回值,只有一个使用其他返回值。

所以我把它放在了setUp中:

$this->someDependency->shouldReceive('someMethod')->andReturn(0);

如果我把它放在那个特定的测试用例中:

$this->someDependency->shouldReceive('someMethod')->andReturn(1);

会被忽略,返回0。

我将这种移动模拟“修复”到所有测试并从 setUp 中删除。但我不喜欢代码重复。

【问题讨论】:

  • 哪个是判断什么时候返回1而不是0的判别器?方法参数数据是否可能?如果是,请检查with() 方法
  • 其实我在调用这个方法时不带参数。这个依赖是学说存储库和这个计数方法,这就是为什么我可以有多个值而不管参数。
  • 您是否尝试过使用andReturn(value1, value2, ...) 中的Mockery docs 方法?
  • 这样我的单元测试将真正相互依赖。
  • 也许如果不是将返回值硬编码为“0”和“1”,您可以为返回值设置一个全局变量,该变量在设置方法中设置一次,然后在测试用例中更新应该有不同的返回值?

标签: php phpunit mockery


【解决方案1】:

这主要是风格问题。您可以在测试调用的辅助函数中轻松创建一组“默认”模拟,然后创建一个更明确的替代版本,以不同方式设置它们。

还可以在该帮助程序中为给定值提供一个函数参数,以便从特定的模拟返回。

有些人认为,除了一些非常常见的设置之外,每个测试都应该彼此完全独立,并且应该在其内部完成所有事情。这确实清楚地说明了正在发生的事情(非常清楚,并且很明显正在发生什么) - 但可能会产生代码重复的成本。但是,如果您不想过多地重复自己,那是您的选择。

【讨论】:

  • 感谢 Alister,关于独立测试,您是对的。但也许有一种方法可以嘲弄更新 shouldReceive,这就是为什么我没有将此答案标记为已接受。
猜你喜欢
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2013-04-20
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多