Ich versuche, eine Zeile in meinem Komponententest aus core_config_table in der Magento 2-Datenbank zu lesen. Ich weiß das, um diesen Job zu erledigen, da ich diesen Link gelesen habe . Ich muss benutzen:
\Magento\Framework\App\Config\ScopeConfigInterface
durch:
\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
Hier ist mein Code:
protected function setUp()
{
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
$this->scopeConfig = $objectManager->getObject('\Magento\Framework\App\Config\ScopeConfigInterface');
}
public function testgetImageCDNConfigValue()
{
$this->scopeConfig->getValue($this->path, \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
if ($this->scopeConfig == null) {
$this->assertFalse(true);
} else {
$this->assertTrue(true);
}
}
Ich kann jedes gewünschte Objekt mit testObject abrufen, \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
aber wann immer ich möchte\Magento\Framework\App\Config\ScopeConfigInterface
Schwerwiegender Fehler: Die Schnittstelle Magento \ Framework \ App \ Config \ ScopeConf igInterface in C: \ xampp \ htdocs \ magento \ vendor \ magento \ framework \ TestFramework \ Un it \ Helper \ ObjectManager.php in Zeile 162 kann nicht instanziiert werden
Antworten:
Ich kann mich hier irren, aber ich denke, für Unit-Tests müssen Sie keine Werte aus der Datenbank abrufen. Sie können davon ausgehen, dass die Implementierungen von
\Magento\Framework\App\Config\ScopeConfigInterface
getestet wurden und ordnungsgemäß funktionieren. Sie müssen nur Ihre Methode testen, diegetValue
von der verwendetScopeConfigInterface
.Wenn Sie beispielsweise eine Methode wie diese haben:
Sie müssen diese Methode nur testen und nicht, wenn der Wert aus der Datenbank Ihren Anforderungen entspricht.
und Sie können das so testen:
Abhängig von der Anzahl der Abhängigkeiten, die in den Konstruktor eingefügt werden müssen, müssen Sie möglicherweise nicht einmal den Unit-Test ObjectManager verwenden, sondern können die zu testende Klasse einfach direkt mit instanziieren
new
.Dies ist einfacher und daher für Unit-Tests vorzuziehen. Der einzige Grund für die Verwendung des Unit-Test-Objekt-Managers besteht darin, dass eine große Anzahl von Abhängigkeiten das manuelle Verspotten jedes einzelnen zu umständlich macht.
quelle
getValue
Fall, dass die Methode true zurückgibt,->willReturn(true)
und eine für den Fall, dassgetValue
false zurückgegeben wird.->willReturn(false)
. Auf diese Weise testen Sie in beiden Fällen Ihr eigentliches Modul, unabhängig davon, was Sie in Ihrer Datenbank haben.Ich denke, Sie müssen dafür Mock verwenden, aber in Ihrem Fall ist eine Umgestaltung Ihres Moduls erforderlich, insbesondere die Notwendigkeit einer
Config
Klasse, die sich auf Ihr Modul bezieht.Sie können Ihre Entwicklung auf das stützen,
app/code/Magento/Braintree/Test/Unit/Gateway/Config/ConfigTest.php
was so etwas implementiert:quelle