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

Mocking Laravel雄辩的模型-如何设置公共属性与Mockery

终子昂
2023-03-14

我想在PHPUnit测试中使用模拟对象(mockry)。模拟对象需要同时设置一些公共方法和一些公共属性。这门课是拉威尔雄辩的典范。我试过这个:

$mock = Mockery::mock('User');
$mock->shouldReceive('hasRole')->once()->andReturn(true); //works fine
$mock->roles = 2; //how to do this? currently returns an error
$this->assertTrue(someTest($mock));

... 但是设置公共属性会返回以下错误:

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

在模拟简单类时不返回此错误,但在尝试模拟雄辩模型时返回此错误。我做错了什么?

共有3个答案

曾绯辞
2023-03-14

要回答您的问题,您还可以尝试以下方法:

$mock = Mockery::mock('User');
$mock->shouldReceive('hasRole')->once()->andReturn(true); //works fine
$mock->shouldReceive('setAttribute')->passthru();
$mock->roles = 2; 

$mock->shouldReceive('getAttribute')->passthru();
$this->assertEquals(2, $mock->roles);

或者,正如seblaze所建议的,使用部分模拟:

$mock = Mockery::mock('User[hasRole]');
$mock->shouldReceive('hasRole')->once()->andReturn(true);
$mock->roles = 2; 
$this->assertEquals(2, $mock->roles);

但是,从您的代码片段来看,如果您正在编写单元测试,那么每个测试实际上应该只做一个断言:

function test_someFunctionWhichCallsHasRole_CallsHasRole() {
    $mock = Mockery::mock('User');
    $mock->shouldReceive('hasRole')->once();

    $mock->someFunctionWhichCallsHasRole();
}

function test_someFunctionWhichCallsHasRole_hasRoleReturnsTrue_ReturnsTrue() {
    $mock = Mockery::mock('User');
    $mock->shouldReceive('hasRole')->once()->andReturn(true);

    $result = $mock->someFunctionWhichCallsHasRole();

    $this->assertTrue($result);
}        
叶茂才
2023-03-14

这个答案有点晚了,但希望它能帮助别人。您当前可以使用“alias”关键字在模拟的雄辩对象上设置静态属性:

$mocked_model = Mockery::mock('alias:Namespace\For\Model');
$mocked_model->foo = 'bar';
$this->assertEquals('bar', $mocked_model->foo);

这也有助于模拟外部供应商类,如一些条带对象。

了解“别名”和“重载”关键字:http://docs.mockery.io/en/latest/reference/startup_methods.html

燕玉堂
2023-03-14

如果要使用此值获取此属性,请使用它:

$mock->shouldReceive('getAttribute')
    ->with('role')
    ->andReturn(2);

如果您调用$user-

 类似资料:
  • 提前感谢您的时间。如果你赶时间,跳到粗体部分。 我有一个以下用例:应用程序的每个用户都使用自己的一组前缀表来创建有说服力的模型(即,对于code_发票使用Invoice.php,对于code_客户使用Client.php)。前缀在用户表中定义(例如users.code)。 在Laravel 5.2中,我已经能够通过在用户登录后读取运行时设置的配置(或会话)变量来轻松设置雄辩模型的$table属性。

  • 我正在用Laravel 5.2开发一个Web应用程序,但有一个问题我无法解决。 我有一个扩展了雄辩模型的模型,但当我试图输出带有“where”的数据库表时,例如 它返回一个包含许多信息的集合,这些信息此时对我来说无用,比如“守卫”、“键入”...我的表的数据在“属性”下。遵循laravel的指南,我看到每个人都像我一样简单地使用它,然后用

  • 我希望避免一直使用表名,而使用别名。

  • 1.id <text id="top">Top</text> id是weex标签(即控件)在template下的唯一标识符,可以通过id来引用对应的weex标签。 var top=this.$el('top')//通过this.el('id')找到标签 dom.scrollToElement(top)//滚动到指定的标签 2.style style="width:200;height:20

  • 我有一个小问题,当我试图通过使用雄辩的模型在列中创建_来排序记录时。订单是按日期而不是按时间进行的。例如,如果我有3条记录的值为created_at: > 2017-07-04 07:16:33 2017-07-04 05:35:01 2017-07-04 05:27:48 使用orderby('created_at','desc')或'asc'时,我有相同的输出。但是,如果我有,订购就可以了 2

  • 我试图通过使用Laravel Eloquent获得数据,但我无法访问。无论何时尝试,它都显示尝试获取非对象的属性“name” 我有两个模型。类别和文章。类别有许多文章。以下是模型: 类别模型 文章模式 物品管理员 查看刀片(admin.article.pending) 在这里的刀片,我不能访问类别通过雄辩的属于功能,我没有得到背后的原因得到的消息: ErrorException(E_ERROR)试