【问题标题】:Running tests in Laravel 4 yields "Unknown method User::save()"在 Laravel 4 中运行测试会产生“未知方法 User::save()”
【发布时间】:2013-06-11 05:37:24
【问题描述】:

我已将 phpunit 添加为作曲家依赖项,composer update 是这样做的。

我写了一个简单的测试,像这样:

$user = new User;
$user->save();

我跑

vendor/bin/phpunit

vendor/bin/phpunit -c phpunit.xml

但我明白了

Undefined method User::save()

同时我可以看到$user instanceof Eloquent是真的。

更糟糕的是 - 如果我这样做 call('POST', '/posts') 我会遇到同样的问题 - Undefined method Post::save()

我错过了什么吗?如何正确运行测试?

相关代码部分:

https://gist.github.com/anonymous/5849706

更新

我将 repo 推送到http://github.com/laravel-test-948320/bearded-bugfixes

实际上将 extends Eloquent 更改为 extends Illuminate\Database\Eloquent\Model 可以解决问题,但我仍然想了解发生了什么。

【问题讨论】:

  • 你为什么使用 alltests.xml 而不是 phpunit.xml?
  • 抱歉,打错了。当然是phpunit.xml
  • 我们可以查看您的app/test/TestCase.php 文件和您的简单测试文件吗?这个文件在哪里?
  • 你确定你在 $user 和 $post 中扩展了 Eloquent 类吗?
  • @AlexandreButynski 相关代码要点:gist.github.com/anonymous/5849706

标签: laravel laravel-4


【解决方案1】:

我重新创建了您的整个测试套件(我在阅读本文时正在设置我的测试套件)。 测试的地方都成功了,所以我想知道你有哪些版本:

  • php版本
  • composer.json 中的 laravel/framework 版本
  • phpunit 版本

奇怪的是,a call() 也会导致未定义的 save()...

您是否安装了任何其他软件包或使用了命名空间?

【讨论】:

  • 我已将其推送到github.com/laravel-test-948320/bearded-bugfixes(只是 GitHub 给出的随机名称)
  • 您在 composer.json 文件中包含了"app/tests/TestCase.php"。我猜这不是必需的。还要确保引导目录中没有compiled.php 文件。
  • 那我放弃了。去用一条大鳟鱼把泰勒扇一下。
【解决方案2】:

尝试扩展 Illuminate\Database\Eloquent\Model 而不是 Eloquent,看看是否会有所不同。可能是自动加载问题。您可以从应用程序中保存模型吗?例如,您可以在路由中创建模型并转储保存功能的结果吗?

另一个问题,您是通过 composer 还是 laravel ClassLoader(global.php 文件)加载模型?过去,当我使用 ClassLoader 时,我在自动加载我的类时遇到了麻烦。

我怀疑这是一个作曲家问题,因为 laravel 处理别名,所以转储自动加载不应该改变任何东西。如果在该文件中编译 Eloquent 别名,则可能运行“artisan clear-compiled”。

暂时想不出别的了。有人有其他想法吗?

【讨论】:

  • 我将 repo 推送到 github.com/laravel-test-948320/bearded-bugfixes 实际上将 extends Eloquent 更改为 extends Illuminate\Database\Eloquent\Model 解决了这个问题,但我仍然想了解发生了什么。如果我扩展 Eloquent,我可以从应用程序(控制器)中保存模型,但不能从测试中保存。
  • 在您的 phpunit.xml 文件中,引导路径是否正确?它应该是 laravel 的 autoload.php 文件的路径
  • 这很奇怪。我没有想法,但我绝对认为这是一个自动加载问题
【解决方案3】:

听起来你的 $user 和 $post 类没有扩展 Eloquent 类。

确保你的文件中有这个:

class User extends Eloquent {
...
}

【讨论】:

  • 就像我在问题中所说的那样——“同时我可以看到 $user instanceof Eloquent 是真的。”
  • 我不知道“instanceof Eloquent”在技术上做了什么,但描述的错误告诉我它没有被正确扩展。另一件事,您是否尝试过在保存之前将数据提供给 $user 对象?否则你只是想保存一组空白数据。
【解决方案4】:

尝试将 parent::setUp() 添加到测试类中的 __construct()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2013-12-23
    相关资源
    最近更新 更多