问题标签 [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 回答
49 浏览

php - 如何使 instanceOf 检查可测试

不幸的是,PHP 不允许字符串类型提示。如果它不是某个类的实例,我想检查以下项目并抛出错误。是否可以对此进行单元测试,无论是通过模拟还是以其他方式执行此检查?

我遇到的麻烦是那$schedule是一个模拟。我需要测试该//more stuff here部分中发生的情况。

目前,$schedule是 的一个实例Mockery::mock('Schedule');

0 投票
1 回答
388 浏览

phpunit - Omnipay 常见的抽象类测试失败

我只是在关注 Omnipay,目的是增加对另一个网关的支持。使用 Composer 安装后,我尝试运行 Paypal(作为示例网关)和 Omnipay Common 测试。使用这两个包,我调整了 bootstrap.php 以便它可以找到作曲家自动加载文件。Paypal 测试运行良好(绿色)。

但是,常见的测试以 1 次失败和 38 次错误失败。所有失败/错误都在 AbstractGatewayTest、AbstractRequestTest、AbstractResponseTest 中。

这让我想知道 PHPUnit 或 Mockery 处理模拟抽象类的方式是否发生了变化。我正在使用 PHPUnit 3.7.34。我最近一直在为 Laravel 项目使用 PHPUnit 4.0.*,但 Omnipay 需要 3.7。

composer.lock 表示我使用的是 Mockery 0.9.0。我正在运行通过 Macports 在 OS X Mavericks 上安装的 php 5.4.*。

任何人都知道什么可能会绊倒我?谢谢!

编辑:示例失败消息:

有 38 个错误:

其中“...”是我的源代码区域。

0 投票
8 回答
21164 浏览

php - Mocking Laravel Eloquent 模型 - 如何使用 Mockery 设置公共属性

我想在我的 PHPUnit 测试中使用一个模拟对象(Mockery)。模拟对象需要同时设置一些公共方法和一些公共属性。该类是 Laravel Eloquent 模型。我试过这个:

...但设置公共属性会返回此错误:

BadMethodCallException:此模拟对象上不存在方法 Mockery_0_User::setAttribute()

模拟简单类时不会返回此错误,但当我尝试模拟 Eloquent 模型时会返回此错误。我究竟做错了什么?

0 投票
1 回答
1439 浏览

php - 如何测试依赖于具有关系的 Eloquent 模型的类?

为依赖于具有关系的 Eloquent 模型的类编写单元测试的最佳方法是什么?例如

  • 真实对象(带数据库)。这很容易,但很慢。

  • 实物(无数据库)。我可以创建一个新对象,但我看不到如何在不写入数据库的情况下设置相关模型。

  • 模拟对象。我在使用 Mockery 和 Eloquent 模型时遇到了问题(例如,请参阅这个问题)。

  • 其他解决方案?

背景:我使用 Laravel 和权威 RBAC进行访问控制。我想找到在单元测试中测试我的访问规则的最佳方法。这意味着我需要在测试期间将用户依赖项传递给授权。

0 投票
2 回答
17557 浏览

php - 嘲笑没有匹配的关闭处理程序

我无法弄清楚为什么在此测试期间会出现此错误。我的测试似乎与其余代码完全匹配。我在看什么?

在我的测试中,我有:

错误:

我缺乏理解的部分原因可能与我不确定Objects: array(....)错误底部出现的内容有关。

0 投票
6 回答
5955 浏览

php - 如何在 PHP 单元测试中模拟构造函数中调用的方法?

我在对具有在构造函数中调用的方法的类进行单元测试时遇到问题。我不明白如何嘲笑这个。也许我应该使用 phpUnit 的 'setUp' 方法?

我正在使用 Mockery 库。还有比这更好的工具吗?

任何建议,将不胜感激。

0 投票
1 回答
2758 浏览

php - Laravel 控制器单元测试模拟模型未调用

我正在尝试测试控制器操作。该操作应调用模型上的函数,返回模型。在测试中,我模拟了模型,将其绑定到 IoC 容器。我通过其构造函数将依赖项注入到控制器中。然而不知何故,没有找到并调用模拟,而是调用了模型的实时版本。(我可以说,因为正在生成日志。)

首先,我的单元测试。创建模拟,告诉它期待一个函数,将它添加到 IoC 容器,调用路由。

其次,注入依赖项的我的控制器构造函数。

然后是我的控制器方法。

控制器方法被正确调用,但它似乎没有看到我的 Mock,所以它正在调用实际模型的函数。这导致模拟的期望失败,并导致对数据库的检查是不可取的。

我在另一个测试中也遇到了同样的问题,尽管这个测试使用了 Laravel 内置的 Facades。

考试:

控制器方法:

我收到错误:

同样,我知道该方法被正确调用,只是似乎没有使用模拟。

0 投票
1 回答
945 浏览

laravel-4 - 如何模拟 Carbon 方法链

我试图嘲笑Carbon::parse($date)->format("Y"),但我不知道该怎么做。

这是我到目前为止所拥有的:

0 投票
2 回答
1160 浏览

php - 无法在 Laravel 中运行多个控制器测试

我正在尝试通过为一些遗留代码编写单元测试(并在此过程中对其进行更新)来清理现有应用程序。我重写了许多库,我真的很喜欢 TDD 方法。然而,现在是时候继续测试一些控制器了,我在第一组测试中遇到了问题。我正在遵循 Jeffery Way 的Laravel Testing Decoded中的解释。

这里的目标是测试我的登录路线:http://my-development-server/login. 代码应该是这样工作的:首先,检查是否有人已经登录 - 如果是,将他们重定向到仪表板(应用程序的主页)。否则,呈现登录页面。很直接。

以下是涉及的路线:

这是AccountController::getLogin方法:

我正在使用该Sentry库进行用户身份验证。

这是我的第一个测试:

此测试模拟“用户在已经登录时尝试登录”的情况。check返回 true(已经登录)并且用户被重定向到名为dashboard. 它运行良好,测试通过。

接下来,我添加一个新的测试,以测试“没有人登录时用户尝试登录”的情况。这是该测试的代码:

当我运行这个测试时,第一个测试通过了,但我NotFoundHttpException在第二个测试方法中得到了一个。

这个问题有几个奇怪的地方:

  1. 如果我注释掉第一个测试方法 ( test_login_alreadyLoggedIn),则第二个测试通过。

  2. 如果我颠倒两个测试方法的顺序,则test_login_notLoggedIn通过和test_login_alreadyLoggedIn失败(即类中的第一个方法通过,第二个失败)。

在我看来,这像是某种配置问题——在第一次测试(通过)之后,有些东西搞砸了,它无法在第二次测试中发出请求——但我不知所措。我已经多次翻阅这本书和谷歌,但找不到任何我缺少的配置的参考。

有什么建议么?

0 投票
2 回答
3321 浏览

php - 使用 Laravel 模型绑定模拟控制器测试

我在我的路由中使用模型绑定将模型传递给我的控制器操作,并希望能够编写测试。如果测试不需要访问数据库,那将是可取的。

在本例中使用用户名绑定模型,然后在路由定义中使用。

在我的控制器中,绑定用户被传递给操作。

现在,在我的测试中,我试图模拟用户。

运行此测试时,我收到以下错误:

我也希望能够使用return User::firstByAttribtues($value);,但 Mockery 不会让我模拟受保护的方法 - 有什么办法可以解决这个问题吗?