- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 laravel(4.2) 框架开发 PHP (5.4.25) 应用程序。我想用 Mockery 测试我的 UserController,所以我以这种方式安装我的 UserController:
class UsersController extends \BaseController {
protected $user;
public function __construct(User $user) {
$this->user = $user;
$this->beforeFilter('csrf', array('on'=>'post'));
}
public function store() {
$validator = Validator::make(Input::all(), User::$rules);
if ( $validator->passes() ) {
$this->user->username = Input::get('username');
$this->user->password = Hash::make(Input::get('password'));
$this->user->first_name = Input::get('first_name');
$this->user->last_name = Input::get('last_name');
$this->user->email = Input::get('email');
$this->user->save();
return true;
} else {
return false;
}
}
我想要模拟 Eloquent User 模型,所以我开发了我的 UsersControllerTest:
class UsersControllerTest extends TestCase {
private $mock;
public function __construct() {}
public function setUp() {
parent::setUp();
$this->createApplication();
}
public function tearDown() {
parent::tearDown();
Mockery::close();
}
public function testStore() {
$this->mock = Mockery::mock('Eloquent','User[save]');
$this->mock
->shouldReceive('save')
->once()
->andReturn('true');
$this->app->instance('User', $this->mock);
$data['username'] = 'qwerety';
$data['first_name'] = 'asd';
$data['last_name'] = 'asd123';
$data['email'] = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e793829493a7808a868e8bc984888a" rel="noreferrer noopener nofollow">[email protected]</a>';
$data['password'] = 'password';
$data['password_confirmation'] = 'password';
$response = $this->call('POST', 'users', $data);
var_dump($response->getContent());
}
}
当我运行测试时,它返回此错误:
Mockery\Exception\InvalidCountException : Method save() from Mockery_0_User should be called
exactly 1 times but called 0 times.
为什么?怎么了?
编辑:我发现了问题 - 如果我不使用模拟对象,一切正常,并且 Controller 在数据库中创建一个新用户,但是当我使用模拟输入时: all()
方法返回空数组。
--谢谢
最佳答案
您测试此方法的方式是在 Controller 构造函数中传递真实 Eloquent 模型的实例,而不是模拟模型。如果您想测试外观(如 documentation 中明确说明的那样),您应该直接在外观上调用 shouldReceive()
方法以对其进行模拟。
但是,由于您正在 Controller 的 store()
方法中重新定义 $this->user
变量,因此不会调用它,除非您删除硬编码实例化并使用注入(inject)的 $user
。
编辑:我忽略了 $this->app->instance('User', $this->mock);
行。因此,问题可能是由于在 store
方法中您直接获取一个新的类实例,而不是通过 Laravel IoC 容器。您应该通过 App::make('User'); 来获取它,而不是存储方法中的
$this->user = new User;
关于php - Laravel 使用 Mockery Eloquent 模型进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782543/
我们有大量使用 JMock 2.5.1 编写的单元测试,其中大多数(全部?)使用本地 Mockery 对象,例如: @RunWith(JMock.class) public class SomeTes
我编写了一个从 aws s3-bucket 获取单个文件的导入函数。 该函数本身是 aws.s3::s3read_using() 的包装器,它将读取函数作为其第一个参数。 为什么要环绕 aws.s3:
我刚开始使用 Mockery并与术语 alias 和 overload 混淆。谁能给我解释一下什么时候使用哪个? 最佳答案 Overload 用于创建“实例模拟”。当创建一个类的新实例时,这将“拦截”
我使用 Laravel (4.1) 框架并阅读了“Laravel-testing-decoded”,这是 Jeffrey Wey 的电子书。 我想测试我的模态用户和我的方法 setPasswordAt
我从一周开始学习 phpunit。我不知道如何只模拟测试类中的一种方法。 (这只是示例,所以我没有写命名空间)。也许你可以帮助我 class SomeService { public func
我希望能够使用 Mockery 在 java 中模拟 File 对象。我似乎无法在 Java 中为文件创建接口(interface)。这可能吗? 编辑: 我需要测试 Indexer 类中的 index
我正在使用 phpunit 和 mockery 在 laravel 中学习单元测试。我目前正在尝试测试 UsersController::store()。 我正在模拟用户模型并使用它来测试索引方法,这
我需要测试,代码创建了一个具有特定参数的类的新实例: $bar = new ProgressBar($output, $size); 我试图创建一个别名 mock 并为 __construct 方法设
我正在尝试在 Controller 中正确模拟对 Eloquent 模型的链式调用。在我的 Controller 中,我使用依赖注入(inject)来访问模型,以便模拟它应该很容易,但是我不确定如何测
我正在尝试测试一个简单的类。我正在学习本教程 ( http://code.tutsplus.com/tutorials/testing-laravel-controllers--net-31456 )
我想使用Mokcery mock一个已经在另一个方法中使用过的静态方法,如下: Class SomeClass { public static function methodA() {
TLDR;使用相同参数调用 mock shouldReceive('method)` 时,如何第一次获取 value1 和第二次获取 value2? 假设我有一个 $order 对象,该对象使用 ge
我想使用 Mockery 并改变它: $mockFoo = $this->getMockBuilder('Foo') ->disableOriginalConstructor()
如果使用 JMock 编写带有模拟的 Java 单元测试,我们应该使用 Mockery context = new Mockery() 或者 Mockery context = new JUnit4M
我正在尝试为我的网络应用程序编写一些单元测试。我使用 Laravel 5.3 和 Mockery。 这是简化的代码: class UserService { protected $userRe
我能以某种方式更新特定 shouldReceive 的 shouldReturn 值吗? 例如,我有几个使用一个返回值的测试,只有一个使用其他返回值。 所以我把它放在了 setUp 中: $this-
我目前正在为 Laravel 4 中的一个包编写测试。 我在模拟 Illuminate\Database\Query\Builder 它几乎一直工作,除非 where 方法使用回调,我无法检查内部方法
这可能是我对模拟的误解。我真的很感激关于为什么模拟一个不存在或存在的类是一件好事的解释? 示例场景:假设我们有一个类依赖于第二个类的输出,我们更改了输出格式或其他格式。这不会让我们的测试保持成功,尽管
我正在尝试测试我的一个服务类,但无法通过 PHPUnit 测试。 测试失败的相关部分: File::shouldReceive('put')->with('app/storage/logs/larav
如何在流明框架中使用模拟? 我使用流明框架。 lumen的文档很简单。我不知道如何使用 mockery 或 facades 来模拟模型。我尝试了一些方法,但没有人奏效。我想在 updatePasswo
我是一名优秀的程序员,十分优秀!