问题标签 [mockery]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2228 浏览

php - 使用链式方法和参数模拟调用

我正在学习如何使用模拟来运行一些单元测试,但我不确定如何模拟我的数据库类。它由可以像以下两个示例一样链接的单独方法组成:

另一种用途可能是:

通过阅读一些文档,我发现我可以做类似的事情:(对于第一种情况)

现在我对如何将“相应”参数传递给方法感兴趣?而且,我将如何模拟第二种情况。

0 投票
1 回答
901 浏览

php - Laravel & Mockery - 单元测试关系数据

我有一个帖子和一个博客类。

从下面可以看出, Posts 类依赖于 Blog 类。

此操作的 url 如下:

我正在尝试对此进行测试,但遇到了问题。

这是我的测试类 PostTestController:

问题是……当 get 本身包含基于数据的变量输出时,如何测试 get 调用?如何正确测试?

0 投票
1 回答
985 浏览

php - 在 Laravel 中测试控制器的正确方法是什么?

我正在重写现有的 Laravel 4 应用程序以确保有足够的测试。长话短说,我已经AccountController使用 TDD 方法重写了我的课程,但我有点头疼。

考虑以下呈现包含用户列表的页面的方法:

我正在使用 Smarty 呈现我的视图并使用 Sentry 进行身份验证。

现在,我想写一些这样的测试:

我一直在关注 Jeffrey Way 的书Laravel Testing Decoded andwritten tests like the one,它们运行良好。

头痛出现在“在这里设置一些模拟......”部分。具体来说,我需要设置的模拟数量是荒谬的。这是因为,作为一个更大的 Web 应用程序的一部分,我使用了一个 View Composer,它将数据添加到 View 模型中:当前用户模型、菜单结构、警报消息、新闻消息、应用程序版本号等。 '已经通过使用“基本”模板进行测试来消除大部分内容,但它仍然有很多东西 - 以至于我正在编写数百行代码来测试这个简单的单行方法。

有没有更好的方法来做到这一点?

在我看来,有两种方法可以做到这一点:

A. 我一直这样做的方式

B. 模拟\View::make调用,以便绕过我的所有模板渲染 - 像这样

如果我采用这种方法,测试会简单得多,我只测试实际在控制器方法中的代码,但我并没有真正测试调用该路由所涉及的所有内容(这可能是一件好事,也可能不是- 我不确定),我担心我不会得到足够的报道。

那么,这样做的最佳方法是什么:(A)、(B)或其他?

编辑

关于我的控制器方法的测试,我有相当多的困惑,@TheShiftExchange 的回答和下面的评论更清楚了。我将尝试在这里解决这个问题,作为一个编辑,因为它给了我更多讨论这个问题的空间。

考虑以下答案中给出的第二个示例:

如果我运行这个测试,它会工作,但它会访问数据库,我试图通过模拟一些东西来避免这种情况。

所以,我可以稍微扩展一下这个测试:

此测试将不起作用,因为除了控制器方法所需的模拟之外,我还需要对视图编写器中的代码进行模拟。除其他外,此代码包括$currentUser = \Sentry::getUser()(用户名显示在我的应用程序页面的右上角)。

所以代码实际上变成了:

它很快就会失控。

这向我表明我做错了什么,但我不确定是什么。我怀疑这个问题源于我不确定我在这里测试的究竟是什么。

所以,毕竟,问题变成了这样:

当我测试控制器的方法时,我真正想要测试的是什么?

  1. 控制器方法中的代码?或者,

  2. 从请求到响应的全过程?

我要测试的是第一项 - 只是控制器方法中的代码。我的问题中的示例非常简单,但我确实有一些控制器方法可以根据用户输入执行表单验证或重定向等操作 - 我想测试该代码。

也许,$this->call()我不需要通过 测试代码,而是直接调用控制器方法?

0 投票
1 回答
1527 浏览

php - 用嘲弄来测试 Laravel 外观总是通过,即使它应该失败

我试图在单元测试期间模拟 Laravel 中的一些外观,但似乎无论如何测试总是通过。

例如,这个例子取自 Laravel 文档:

看来我可以把它放在任何测试方法中,即使Event外观没有做任何事情,它们也总是通过。

这是测试类:

为了测试 Facades,我缺少什么?我是否认为我应该能够shouldReceive()在没有任何设置的情况下调用任何 Laravel Facade?

0 投票
1 回答
2581 浏览

laravel - 使用 mockery 测试 Laravel 控制器时出错:在非对象上调用成员函数 fetchMock()

在 Laravel 4.2 中使用控制器的 Mockery (dev-master) 进行 PHPUnit 测试时收到以下错误:

致命错误:在第 129 行的 \laravel\vendor\mockery\mockery\library\Mockery.php 中的非对象上调用成员函数 fetchMock()

控制器和测试如下:

这个测试在没有 Mockery 的情况下工作正常(即没有执行$this->app->instance('User', $this->mock);

执行时在fetchMock函数 内部引发错误return self::$_container->fetchMock($name);

以下是 fetchMock 失败时在调试器中可见的值:

在此处输入图像描述

是什么导致了这个错误?

0 投票
1 回答
78 浏览

php - 我对嘲弄做错了什么

这是我的测试代码:

当我运行测试时,它返回以下错误:

1) TransceiverTest::testTransceiverEntityCreate Argument 2 passed to Recoder\Entities\Transceiver::__construct() must be an instance of Recoder\TransceiverUtils, instance of Mockery_2__TransceiverUtils given, called in /var/www/solidoptics-recorder/private/application/libraries/Recoder/tests/Entities/TransceiverTest.php on line 35 and defined

为什么选择 Mockery_2__TransceiverUtils?我会很高兴有任何想法。谢谢。

0 投票
2 回答
1187 浏览

laravel - phpunit 找不到模型方法(Laravel / Mockery)

我开始在 Laravel 4 中进行单元测试,并且我一直在测试我添加到标准用户模型中的模型中的自定义方法。

此类扩展了 BaseModel,后者又扩展了 Eloquent,并定义了 logIt 和 StreamIt 方法,如下所示:

当我手动测试时,所有这些代码都可以正常工作。但现在我想创建一个单元测试来自动化它。

当我尝试运行它时,我抱怨找不到 logAndStream 失败。

我错过了什么?

0 投票
3 回答
1467 浏览

unit-testing - 如何Str::shouldReceive?(嘲笑 Illuminate\Support\Str)

我有一个Str::random()我想测试的类。

但是当我Str::shouldReceive('random')在测试中使用时,我得到一个 BadMethodCallException 说方法 shouldReceive 不存在。

我还尝试直接模拟该类并将其绑定到 IOC,但它继续执行原始类,生成一个随机字符串,而不是我在模拟上设置的返回值。

0 投票
1 回答
574 浏览

laravel - Laravel 控制器对路由测试给出不同的答案

我正在使用 Laravel 4 和 Mockery 为控制器构建一些单元测试。

我一直在通过直接调用控制器方法(以单独对方法进行单元测试)和通过路由调用方法(以专注于响应)进行测试,但根据我是否调用控制器与走路线。

这是我足智多谋的控制器:

这是我的路线:

这是我的测试:

你看我正在测试直接控制器访问testDestroyOk(),而不是通过 routes.php 调用相同的方法testDestroyOkRoute()。两个测试用例都是使用通用prepDestroyOk()方法设置的,以确保它们是一致的。

然而,当它从我的控制器中的方法抛出 ResourceNotFoundException 时testDestroyOk()通过并testDestroyOkRoute()失败。getUser()

任何想法为什么访问控制器有效但通过路由以某种方式被不同地对待?

0 投票
2 回答
1869 浏览

unit-testing - 自称 PhpUnit / Mockery 的模拟方法

嗨,伙计们,我有一种方法可以在确定的情况下将其称为 self,该方法的一个简短示例可以是:

如果我想为这种丑陋的方法编写一个测试(仅出于示例目的),我会这样做:

但是我如何在代码上方编写注释,我无法正确地模拟该方法add,因为我需要对其进行断言,但即使是真的会再次调用并且我应该完成它的行为。

运行此单元测试的错误跟踪:

此模拟对象上不存在方法 Mockery_1_Mocks_My_Class::add()

你如何实现这个小功能的测试?