代码之家  ›  专栏  ›  技术社区  ›  Bolek Lolek

添加接口到mock with mockry(硬依赖)

  •  0
  • Bolek Lolek  · 技术社区  · 6 年前

    这不起作用:

    Mockery::mock('overload:'.CurrencyEnum::class);
    

    错误: (..) must be an instance of \BaseCurrency, instance of \CurrencyEnum given . 我看着 Mockery\Container::mock 在我想测试的例子中 TestingClass::first() 方法

    class CurrencyEnum implements BaseCurrency
    {
        /* methods */
    }
    
    
    class TestingClass
    {
        public function first(string $currencySymbol)
        {
            $abc = 'some_string';
    
            return $this->second($abc, new CurrencyEnum($currencySymbol));
        }
    
        private function second(string $abc, BaseCurrency $currency)
        {
            /* code */
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  6
  •   Stratadox    6 年前

    重载方法通过拦截 autoload overloaded 类,加载类的模拟版本而不是原始版本。

    通常情况下, implementing one or more interfaces 可以通过提供逗号分隔的完全限定名列表来完成,第一个是类:

    $mock = Mockery::mock('MyClass, MyInterface, OtherInterface');
    

    因为 Mockery::mock 方法已设置,此操作将不起作用。( The author apologises in the source code

    Mockery::mock('overload:'.CurrencyEnum::class, BaseCurrency::class);
    

    这将导致 MockConfigurationBuilder 添加 BaseCurrency 作为目标;因为它是一个接口,所以它将使mock实现接口。

    Mockery::mock(
        (new MockConfigurationBuilder())
            ->setInstanceMock(true)
            ->setName(CurrencyEnum::class)
            ->addTarget('stdClass')
            ->addTarget(BaseCurrency::class)
    )
    

    实际的 CurrencyEnum ? 像货币代码这样简单的东西根本不值得嘲笑。可能需要做一个结构上的改进,这将同时为您的测试增加大量的价值,并使它们更易于阅读。