0%

解决方法:https://github.com/laravel/passport/issues/221

In your oauth_clients table, do the values you have above exist exactly as you have them in your database?

oauth_clients

1
2
3
id - 3
secret - 3TfJGj4rrvOQvjZkI8dDqx78ouH99F2DuIMKHoKH
redirect - http://consumer.dev/callback

If it doesn't exist exactly like that in the database for passport.dev then it will throw the invalid_client error. Please be sure to check that and we will see if any further investigation is needed.

x

还需要查看 oauth_clients 表的 password_client 是否为 1

  • 什么是嵌套事务? 一般情况下我们都是一个 begin, 一个 commitrollBack, 但是有可能我们有种场景需要 begin 然后在事务里面再开一个事务, 这就是嵌套事务.

  • MySQL 嵌套事务支持

    • MySQL 里面有个 savepoint 关键字, 可以模拟嵌套事务, 但事实上并不是真正的嵌套事务, 仍然是一个事务.
    • savepoint 的用处, 我们可以回滚事务内的部分修改
  • Laravel 嵌套事务使用

    • DB::beginTransaction() 里面再次使用 DB::beginTransaction() 即可, 但需要注意开启事务的次数需要和 commitrollBack 的次数对应

一个 test 多个请求

$this->post,然后又 $this->post,我们会发现第二个请求中的请求参数是和第一个请求的参数是完全一样的, 然后在 Controller 里面通过 spl_object_hash 方法发现两个请求的 request 实例是一样的, 应该是第二个请求发起的时候,request 不再实例化,直接使用了上一次请求的 request 实例。

这种情况我们可以用过 request 实例的 replace 方法,替代掉 request 实例的请求参数,这样我们第二个请求就可以按照我们预期地跑了。

1
2
3
4
5
6
7
$this->post('xxx', ['a' => 1]);

app('request')->replace([
'b' => 2
]);

$this->post('yyy');

使用 mock 的时候,mock 一个不存在的方法不会报错

其实这也算是 mock 本身要实现的功能,但是如果我们可能在调用多个对象的方法的时候会混淆,mock 了一个错误的对象的方法,但实际上应该是 mock 另外一个。

如果我们 mock 了之后,对象方法表现还是原来的样子就应该考虑一下是不是 mock 了一个错误的对象。

不能对 private final static 方法进行 mock,需要对 mock 的对象调用 setMethods,说明我们要对哪些方法进行 mock,否则可能会报错。