2

我对 PHPUnit 很陌生,对于我的第一个自制测试用例,我想通过提供这样的 PHPUnit 链接来检查网站是否有图像。

让我打电话给我想测试的链接http://somedomain.com/images/images.jpg

现在,我写了这个函数,我知道我可能做错了,但这就是我在这里问它的原因。

class WebsiteHasImage{
    public function images(){
        $website = 'http://somedomain.com/images/img.jpg';
        return $website;
    }
}


class WebsiteHasImageTest extends PHPUnit_Framework_TestCase
{
    public function testSuccess(){
      $this->assertTrue($this->images(), TRUE);
    }
}


 Call to undefined method WebsiteHasImageTest::images() in ... on line 15

第 15 行就是这个。 $this->assertTrue($this->images(), TRUE);

4

2 回答 2

3

您的课程将为 images() 返回一个字符串,这不是您真正测试的内容。

class WebsiteHasImage{
    public function images(){
        $website = 'http://somedomain.com/images/img.jpg';
        return $website;
    }
}

class WebsiteHasImageTest extends PHPUnit_Framework_TestCase
{
    public function testSuccess()
    {
        WebSiteImage = new WebSiteHasImage();
        $this->assertEquals('http://somedomain.com/images/img.jpg', $WebSiteImage->images(), 'Check returned File Name is correct');
    }
}

这一切所做的就是测试图像字符串是否正确。

您可以尝试通过另一个调用读取图像,然后进行比较,但这需要您的网站已启动。

或者,该调用可以查看当前应用程序目录中的 images/img.jpg 并进行一些测试(字节大小是否合适,等等...)来验证图像。

您可以尝试阅读网站并返回内容,但同样需要网站。因此,为了测试您的代码,您有一个返回网站数据的类,然后模拟该类以返回一个固定的字符串,然后您将针对该类编写测试以查看您的类中的代码是否正确提取图像。然后,您的类可以测试图像是否存在,并再次模拟它以始终返回它来测试您的代码的作用。

public function GetWebPageContents($HTTPAddress)
{
    $HTML = ...    // Code that reads the contents
    return $HTML;
}

public function GetImageList($HTML)
{
    $ImageList = array();
    ...      // Code to find all images, adding to ImageList
    return $ImageList;
}

测试类添加

public function testGetWebPageContents()
{
$HTMLText = '<html><body><img scr=""></img></body><</html>';        // Fill this with a sample webpage text
    $MockClass = $this->getMock('WebsiteHasImage', array('GetWebPageContents'));

    // Set up the expectation for the GetWebPageContents() method 
    $MockClass->expects($this->any())
                ->method('GetWebPageContents')
                ->will($this->returnValue($HMTLText));

    // Create Test Object
    $TestClass = new MockClass();
    $this->assertEquals($HTMLText, $TestClass->GetWebPageContents('http://testaddress.com'), 'Validate Mock HTML return'); // Address is garbage as it does not matter since we mocked it

    $WebsiteTest = new WebsiteHasImage();
    $ImageList = $WebsiteTest->GetImageList($HTMLText);
    $this->assertEquals(1, count($ImageList), 'Count Total Number of Images');
    $this->assertEquals('images/img.jpg', $ImageList[0], 'Check actual image file name from dummy HTML parsing');

    ...       // More tests for contents
}

现在,最好的改变是在您的类中使用读取的数据,为此,您可以在从网站读取 HTML 代码后正常将其传递给类。在您的测试中,您将使用构造函数中的 Mock 对象或通过 Set 传递执行读取的对象。在 Google 上搜索 Dependency Injection、Mock Objects 等...以查找有关此主题的更多信息。

于 2013-09-11T19:59:44.320 回答
1

我自己没有使用过 PHPunit,但是查看您的代码将$this->images()不起作用,因为您在类中没有 images 方法WebsiteHasImageTest

<?php
class WebsiteHasImageTest extends PHPUnit_Framework_TestCase
{
    public function images(){
        $website = 'http://somedomain.com/images/img.jpg';
        return $website;
    }
    public function testSuccess(){
      $this->assertTrue($this->images(), TRUE);
    }
}

这将消除对 的需要WebsiteHasImage,但如果需要,您可以这样做。

<?php
class WebsiteHasImage{
    public function images(){
        $website = 'http://somedomain.com/images/img.jpg';
        return $website;
    }
}
class WebsiteHasImageTest extends PHPUnit_Framework_TestCase
{
    public function testSuccess(){
      $images = new WebsiteHasImage();
      $this->assertTrue($images->images(), TRUE);
    }
}

所以它只是归结为:a)将您的方法移动到WebsiteHasImageTest类或b)WebsitehasImage()在您的方法中启动一个新对象WebsiteHasImageTest testSuccess

于 2013-09-11T17:51:05.270 回答