当前位置: 首页 > 知识库问答 >
问题:

Codeception改进准备就绪单元测试

沈博达
2023-03-14

我是测试新手,我正在使用codeception和phpunit来做一些TDD。

然而,我的方法有很多代码。我是否使用了最佳实践?有没有一种方法可以提高我的代码的就绪性,它能更干净吗?

class NewsFormHandlerTest extends \Codeception\Test\Unit
{
    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
    }

    protected function _after()
    {
    }

    private function getFormMock(){

        return $this->getMockBuilder(FormInterface::class)
            ->disableOriginalConstructor()
            ->getMock();
    }

    private function getNewsManagerMock(){

        return $this->getMockBuilder(INewsManager::class)
            ->disableOriginalConstructor()
            ->getMock();
    }

    // tests

    public function testShouldHandleASuccessfulFormSubmissionForAddANews()
    {

        // prepare
        $request = new \Symfony\Component\HttpFoundation\Request();
        $news = new News();

        $form = $this->getFormMock();
        $form->expects($this->once())
            ->method('isValid')
            ->will($this->returnValue(true));

        $form->expects($this->once())
            ->method('submit');

        $form->expects($this->once())
            ->method('getData')
            ->will($this->returnValue($news));

        $newsManager = $this->getNewsManagerMock();
        $newsManager->expects($this->once())
            ->method('add');

        $user = Stub::make(WebserviceUser::class, []);

        // test
        $handler = new NewsFormHandler($newsManager, $user);
        $newsReturned = $handler->handle($form, $request, NewsFormHandler::ADD);

        // assert
        $this->assertInstanceOf(News::class, $newsReturned);
        $this->assertEquals($news, $newsReturned);

    }

    public function testShouldHandleASuccessfulFormSubmissionForEditANews()
    {

        // prepare
        $request = new \Symfony\Component\HttpFoundation\Request();
        $news = new News();

        $form = $this->getFormMock();
        $form->expects($this->once())
            ->method('isValid')
            ->will($this->returnValue(true));

        $form->expects($this->once())
            ->method('submit');

        $form->expects($this->once())
            ->method('getData')
            ->will($this->returnValue($news));

        $newsManager = $this->getNewsManagerMock();
        $newsManager->expects($this->once())
            ->method('edit');

        $user = Stub::make(WebserviceUser::class, []);

        // test
        $handler = new NewsFormHandler($newsManager, $user);
        $newsReturned = $handler->handle($form, $request, NewsFormHandler::EDIT);

        // assert
        $this->assertInstanceOf(News::class, $newsReturned);
        $this->assertEquals($news, $newsReturned);

    }

    public function testFailFormWithInvalidData()
    {

        // prepare
        $request = new \Symfony\Component\HttpFoundation\Request();

        $form = $this->getFormMock();
        $form->expects($this->once())
            ->method('isValid')
            ->will($this->returnValue(false));


        $newsManager = $this->getNewsManagerMock();
        $newsManager->expects($this->never())
            ->method('edit');

        $this->expectException(InvalidFormException::class);

        $user = Stub::make(WebserviceUser::class, []);

        // test
        $handler = new NewsFormHandler($newsManager, $user);
        $newsReturned = $handler->handle($form, $request, NewsFormHandler::ADD);

        // assert
        $this->assertNull($newsReturned);

    }



}

共有1个答案

卫鸿朗
2023-03-14

>

  • 您可能可以将TestShouldHandleSuccessfulFormSubmissionForAddNews和TestShouldHandleSuccessfulFormSubmissionForEditaNews的主体提取到其他方法,使用$action='add'|'edit'(或使用您定义的contants NewsFormHandler::edit等)等参数,因为它们几乎相同。

    您可以将上述方法中的模拟创建提取到单个参数化方法中,因为过程几乎相同(将差异作为方法参数传递,并让它执行脏活)。

    您还可以使用BDD样式添加一些可读性,如第页中的示例所示http://codeception.com/docs/05-UnitTests#BDD-规格测试

  •  类似资料:
    • 我遇到了一个问题: 获取健康检查以成功。尝试使用容器本机负载平衡(CNLB)时,在IIS容器中运行的Net app。 我有一个网络endpoint组(NEG),由GKE中的入口资源定义和VPC本机集群创建。 当我通过公开NodePort或制作LoadBalancer类型的服务来规避CNLB时,站点会毫无问题地解决。 所有的吊舱条件从一个描述看起来不错:吊舱准备就绪 运行时会显示网络endpoint

    • 我无法创建某个docker容器,因为jenkins告诉我该名称已在使用中。 我已尝试查找或删除此容器,但无法执行以下操作: 容器是通过jenkins构建的,在不同的构建中,总是有相同的容器id在使用中被否认。我们有八个不同的jenkins节点,这项工作在其中七个节点上工作,创建和删除具有该名称的docker图像。 如何移除这个“幽灵”容器?Allready尝试了但没有成功:

    • 问题内容: 我正在使用Cordova和AngularJS开发移动应用程序。在准备好Cordova设备之前,如何限制AngluarJS的引导。基本上,我不想在设备准备就绪之前使用任何AngularJS控制器。 问题答案: 手动引导您的Angular应用程序: 从HTML代码中删除属性,因此Angular不会自行启动。 在您的JavaScript代码中添加以下内容: 有关引导应用程序的角度文档。

    • 在为kubernetes吊舱做健康检查的时候,为什么在我们已经保持了准备状态探测器的情况下还需要活性探测器呢? Readision probe已经在检查pod中的应用程序是否准备好为请求提供服务,这意味着pod是活动的。但是,为什么要进行活性探测呢?

    • 我正在尝试为我的简单网站编写一些单元测试(用于学习)。 项目结构: 在index.php中,我定义了一个。 函数位于中,类位于中。 测试/单元/BuildGalleryTest.php代码: 当运行我得到以下错误: 我做错了什么?如何解决这个问题?

    • 我正在尝试设置istio1。5.1在minicube kubernetes集群中,我遵循Knative的官方文档,在不使用侧车注入的情况下设置istio。我我面临istio入口网关服务的问题,该服务将入口网关服务的外部ip显示为。我已经浏览了这里发布的其他答案,以及许多其他论坛,但没有一个对我有帮助。 使用Minikube v1.9.1与驱动=无头盔v2.16.5 kubectl v1.18.0